android实现滚动文本效果
作者:lanlengran蓝冷然 发布时间:2022-02-02 16:49:36
标签:android,滚动文本
本文实例为大家分享了android实现滚动文本效果的具体代码,供大家参考,具体内容如下
效果图
实现方法
直接上代码
首先是一个自定义layout,继承自FrameLayout
public class AnimationTextLayout extends FrameLayout {
private static final String TAG = "AnimationTextLayout";
private List<String> tipList;
private List<Integer> displayList;
private List<TextView> viewList;
private List<VirtualPos> virtualPosList;
private double deviantAngle = 0;
public AnimationTextLayout(@NonNull Context context) {
super(context);
initView();
}
public AnimationTextLayout(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
initView();
}
public AnimationTextLayout(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView();
}
private void initView() {
viewList = new ArrayList<>();
displayList = new ArrayList<>();
virtualPosList = new ArrayList<>();
}
/**
* 设置需要显示的数据
*
* @param data 需要显示的数据
*/
public void setData(List<String> data) {
this.tipList = data;
initTips();
}
private void initTips() {
while (tipList.size() > viewList.size()) {
addTipsView();
}
refreshTips();
initVirPos();
post(new Runnable() {
@Override
public void run() {
initPosition();
requestLayout();
}
});
}
/**
* 计算虚拟位置
*/
private void initVirPos() {
virtualPosList.clear();
for (int i = 0; i < viewList.size(); i++) {
double angle = (Math.PI * ((double) i / viewList.size())*2)+(deviantAngle*Math.PI*2);
if (angle>Math.PI*2){
angle-=Math.PI*2;
}
VirtualPos virtualPos = new VirtualPos();
virtualPos.text = tipList.get(i);
virtualPos.z = 100 * Math.sin(angle);
virtualPos.y = 100 * Math.cos(angle);
virtualPosList.add(virtualPos);
}
}
/**
* 将虚拟位置转化为实际高度和位置
*/
private void initPosition() {
for (int i = 0; i < viewList.size(); i++) {
TextView textView = viewList.get(i);
VirtualPos virtualPos=virtualPosList.get(i);
int realY = (int) ((100 - virtualPos.y)/200 *getMeasuredHeight());
FrameLayout.LayoutParams layoutParams = (LayoutParams) textView.getLayoutParams();
layoutParams.topMargin = realY;
if (virtualPos.z>=0){
float textSize= (float) (( virtualPos.z)/100)*20+5;
textView.setTextSize(textSize);
textView.setVisibility(VISIBLE);
}else {
textView.setVisibility(GONE);
}
Log.d(TAG, "initPosition: y=="+realY);
}
}
private void refreshTips() {
for (int i = 0; i < viewList.size(); i++) {
TextView tip = viewList.get(i);
if (i < tipList.size()) {
tip.setVisibility(VISIBLE);
tip.setText(tipList.get(i));
continue;
}
tip.setVisibility(GONE);
}
}
private TextView addTipsView() {
TextView textView = new TextView(getContext());
textView.setTextSize(COMPLEX_UNIT_DIP, 12);
textView.setTextColor(Color.parseColor("#444444"));
textView.setPadding(ConvertUtil.dp2px(5), ConvertUtil.dp2px(3), ConvertUtil.dp2px(5), ConvertUtil.dp2px(3));
LayoutParams layoutParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
layoutParams.gravity=Gravity.CENTER_HORIZONTAL;
layoutParams.rightMargin = ConvertUtil.dp2px(6);
addView(textView, layoutParams);
viewList.add(textView);
return textView;
}
/**
* 虚拟位置,最大x,y,z 最大值为100,最小值为-100
*/
public static class VirtualPos {
public double x;
public double y;
public double z;
public String text;
}
/**
* 滚动的偏移值
* @param deviantAngle 最大为1
*/
public void setDeviantAngle(float deviantAngle) {
this.deviantAngle = deviantAngle;
initVirPos();
initPosition();
}
public double getDeviantAngle() {
return deviantAngle;
}
}
调用方布局
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".AnimationTextActivity">
<com.lanlengran.test.view.AnimationTextLayout
android:id="@+id/anim_text_layout"
android:layout_width="match_parent"
android:background="@color/colorAccent"
android:layout_height="400dp"/>
</FrameLayout>
调用方代码
public class AnimationTextActivity extends Activity {
private AnimationTextLayout mAnimTextLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_animation_text);
mAnimTextLayout = findViewById(R.id.anim_text_layout);
List<String> testData = new ArrayList<>();
for (int i = 0; i < 30; i++) {
testData.add("测试数据" + i);
}
mAnimTextLayout.setData(testData);
ObjectAnimator animator = ObjectAnimator.ofFloat(mAnimTextLayout, "deviantAngle", 0f, 1f);
animator.setDuration(5000);
animator.setRepeatCount(-1);
animator.start();
}
}
注意事项
此处的动画只是为了演示。可以根据需要改变自定view的改变滚动值的方法,就可以使滚轮滚动。例如将滚动的角度和手指拖动相结合啥的
/**
* 滚动的偏移值
* @param deviantAngle 最大为1
*/
public void setDeviantAngle(float deviantAngle)
来源:https://blog.csdn.net/qq_17810899/article/details/106381674
0
投稿
猜你喜欢
- 锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized 和 ReentrantLock等等 ) 。这些
- 1、什么是GradleGradle是一种结合了Ant和Maven两者优势的下一代构建工具,既有Ant构建灵活性的优点,也保留Maven约定优
- 本文实例讲述了C#使用GDI+创建缩略图的方法,分享给大家供大家参考。具体方法分析如下:C#的Gdi+还是相当好用的。创建缩略图步骤如下:1
- Scrollview标题栏滑动渐变仿京东样式(上滑显示下滑渐变消失)/** * @ClassName MyScrollView * @Aut
- 一、deleteById 和 delete为什么要把这两个方法放在一起呢?我们先看源码再说deleteById(Id id)(通过id进行删
- 一、配置xml路径mybatis-plus:mapper-locations: classpath:mapper/*.xml二、编写Mapp
- 本文研究的主要是Java数组的扩容的相关代码示例,具体实现过程如下所示。在写程序的过程中,我们常常会碰见数组空间不够用的情况,比如我已经初始
- 1.背景在项目中有些敏感信息不能直接展示,比如客户手机号、身份证、车牌号等信息,展示时均需要进行数据脱敏,防止泄露客户隐私。脱敏即是对数据的
- 本文实例讲述了Spring和Hibernate的整合操作。分享给大家供大家参考,具体如下:一 web配置<?xml version=&
- 前言前几天 在自己的 笔记本上把android studio 升级到4.1了 一直没有使用Gsonfomat插件所以没有发现问题!今天使用G
- 本文实例为大家分享了Android实现表情功能的具体代码,供大家参考,具体内容如下Dialog实现表情评论功能核心问题:1、如何得到键盘弹起
- 前言在Android开发过程中,我发现很多安卓源代码里应用了设计模式,比较常用的有适配器模式(各种adapter),建造者模式(Alert
- 1.类的属性 filed1)在kotlin中定义属性,必须赋初始值,要不编译器检查不通过。这个和java不同2)kotlin会针对于定义的每
- 一、项目简述功能: 主页显示商品; 所有蛋糕商品展示,可进行商品搜索; 点击商品进入商品详情页,具有立即购买功能,可增减购买商品数量亦可手动
- 效果自定义密码输入框,项目的一个界面需求,我把这个自定义的输入框提取出来作为这次内容的题目。输入前: 输入后: 输入1个
- 接口的灵活性就在于“规定一个类必须做什么,而不管你如何做”。我们可以定义一个接口类型的引用变量来引用实现接口的类的实例,当这个引用调用方法时
- 前言本博客将分析一下大名鼎鼎的 Leakcanary 想必作为 Android 开发都多多少少接触过,新版本的 Leakcanary 也用
- 1、这个方法在GpsNET.JT809Core里来源:https://www.cnblogs.com/cnsend/p/12197982.h
- IDEA 在接入外接屏且扩展的情况下,如果突然拔掉外接屏,就可能会产生IDEA 整个窗口只在屏幕的右侧显示一点点边框且无法拖拽到当前屏幕的情
- TextView加载字体包在 Android 中,若需要使得某个TextView加载字体包,使用以下方式即可: Typeface typeF