自定义TextSwitcher实现文本自动垂直滚动​​​​​​​

news/2024/5/17 19:46:01 标签: gitee

Android自定义TextSwitcher实现文本自动垂直滚动_android autoverticalscrolltextview-CSDN博客

package www.autotextview.com.autotextview;
 
import android.app.Activity;
import android.os.Bundle;
 
import java.util.Arrays;
import java.util.List;
 
import www.autotextview.com.autotextview.View.AutoVerticalScrollTextView;
 
public class MainActivity extends Activity {
 
    private String[] strings={"于晴兑换了云上汽车ESLOE水杯","王东春兑换了云上汽车ESLOE水杯","黄春岩兑换了炫彩时代雨点杯两件套","赵轲兑换了炫彩多用组合盆","关若瀛兑换了炫彩多用组合盆"};
 
    private AutoVerticalScrollTextView verticalScrollTV;
    List<String> list;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        initView();
    }
 
    private void initView() {
 
        verticalScrollTV = (AutoVerticalScrollTextView) findViewById(R.id.textview_auto_roll);
 
 
        list =  Arrays.asList(strings);
 
        verticalScrollTV.setList(list);
        verticalScrollTV.setTextStillTime(3000);//设置停留时长间隔
        verticalScrollTV.setAnimTime(300);//设置进入和退出的时间间隔
        verticalScrollTV.startAutoScroll();
 
    }
 
    @Override
    protected void onDestroy() {
        super.onDestroy();
        verticalScrollTV.stopAutoScroll();
    }
}
package www.autotextview.com.autotextview.View;
 
import android.content.Context;
import android.graphics.Camera;
import android.graphics.Matrix;
import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.View;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.Animation;
import android.view.animation.Transformation;
import android.widget.TextSwitcher;
import android.widget.TextView;
import android.widget.ViewSwitcher;
 
import java.util.List;
 
import www.autotextview.com.autotextview.R;
 
/**
 * 自动垂直滚动的TextView
 */
public class AutoVerticalScrollTextView extends TextSwitcher implements ViewSwitcher.ViewFactory {
 
    private Context mContext;
 
    //mInUp,mOutUp分别构成向下翻页的进出动画
    private Rotate3dAnimation mInUp;
    private Rotate3dAnimation mOutUp;
 
    public AutoVerticalScrollTextView(Context context) {
        this(context, null);
    }
 
    public AutoVerticalScrollTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
 
        mContext = context;
        init();
 
    }
 
    private void init() {
 
        setFactory(this);
 
        mInUp = createAnim(true, true);
        mOutUp = createAnim(false, true);
 
        setInAnimation(mInUp);//当View显示时动画资源ID
        setOutAnimation(mOutUp);//当View隐藏是动画资源ID。
 
    }
 
    private Rotate3dAnimation createAnim( boolean turnIn, boolean turnUp){
 
        Rotate3dAnimation rotation = new Rotate3dAnimation(turnIn, turnUp);
        rotation.setDuration(animTime);//执行动画的时间
        rotation.setFillAfter(false);//是否保持动画完毕之后的状态
        rotation.setInterpolator(new AccelerateInterpolator());//设置加速模式
 
        return rotation;
    }
 
 
    private boolean isRunning=true;
    private int number =0;
    List<String> list;
    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
 
            if (msg.what == 199) {
                next();
                number++;
                setText(list.get(number%list.size()));
            }
        }
    };
 
 
    public void setList(List<String> list){
        this.list = list;
    }
 
    public void startAutoScroll(){
        number =0;
        isRunning = true;
        new Thread(){
            @Override
            public void run() {
                while (isRunning){
                    handler.sendEmptyMessage(199);
                    SystemClock.sleep(textStillTime);
 
                }
            }
        }.start();
    }
 
 
    public void stopAutoScroll(){
        isRunning = false;
    }
 
    private int textStillTime = 3000;//停留时长间隔
    private int animTime = 300;//执行动画的时间
 
    /**
     * 设置停留时长间隔
     */
    public void setTextStillTime(int textStillTime){
        this.textStillTime = textStillTime;
    }
 
    /**
     * 设置进入和退出的时间间隔
     */
    public void setAnimTime(int animTime){
        this.animTime = animTime;
    }
 
    //这里返回的TextView,就是我们看到的View,可以设置自己想要的效果
    public View makeView() {
 
        TextView textView = new TextView(mContext);
        textView.setGravity(Gravity.LEFT);
        textView.setTextSize(15);
        textView.setSingleLine(true);
        textView.setGravity(Gravity.CENTER_VERTICAL);
        textView.setEllipsize(TextUtils.TruncateAt.END);
        textView.setTextColor(getResources().getColor(R.color.player_black));
        return textView;
 
    }
 
    //定义动作,向上滚动翻页
    public void next(){
        //显示动画
        if(getInAnimation() != mInUp){
            setInAnimation(mInUp);
        }
        //隐藏动画
        if(getOutAnimation() != mOutUp){
            setOutAnimation(mOutUp);
        }
    }
 
    class Rotate3dAnimation extends Animation {
        private float mCenterX;
        private float mCenterY;
        private final boolean mTurnIn;
        private final boolean mTurnUp;
        private Camera mCamera;
 
        public Rotate3dAnimation(boolean turnIn, boolean turnUp) {
            mTurnIn = turnIn;
            mTurnUp = turnUp;
        }
 
        @Override
        public void initialize(int width, int height, int parentWidth, int parentHeight) {
            super.initialize(width, height, parentWidth, parentHeight);
            mCamera = new Camera();
            mCenterY = getHeight() ;
            mCenterX = getWidth() ;
        }
 
        @Override
        protected void applyTransformation(float interpolatedTime, Transformation t) {
 
            final float centerX = mCenterX ;
            final float centerY = mCenterY ;
            final Camera camera = mCamera;
            final int derection = mTurnUp ? 1: -1;
 
            final Matrix matrix = t.getMatrix();
 
            camera.save();
            if (mTurnIn) {
                camera.translate(0.0f, derection *mCenterY * (interpolatedTime - 1.0f), 0.0f);
            } else {
                camera.translate(0.0f, derection *mCenterY * (interpolatedTime), 0.0f);
            }
            camera.getMatrix(matrix);
            camera.restore();
 
            matrix.preTranslate(-centerX, -centerY);
            matrix.postTranslate(centerX, centerY);
        }
    }
 
}
 

Android中TextView实现垂直滚动和上下滚动效果_Android_脚本之家

Android:TextView的垂直滚动效果,和上下滚动效果_android textview从下到上淡入当初效果-CSDN博客


http://www.niftyadmin.cn/n/5380640.html

相关文章

【快速解决】python项目打包成exe文件——vscode软件

目录 操作步骤 1、打开VSCode并打开你的Python项目。 2、在VSCode终端中安装pyinstaller&#xff1a; 3、运行以下命令使用pyinstaller将Python项目打包成exe文件&#xff1a; 其中your_script.py是你的Python脚本的文件名。 4、打包完成后&#xff0c;在你的项目目录中会…

Day48 115 不同的子序列 583 两个字符串的删除操作 72编辑距离

115 不同的子序列 给定一个字符串 s 和一个字符串 t &#xff0c;计算在 s 的子序列中 t 出现的个数。 字符串的一个 子序列 是指&#xff0c;通过删除一些&#xff08;也可以不删除&#xff09;字符且不干扰剩余字符相对位置所组成的新字符串。&#xff08;例如&#xff0c;…

深入了解 Java 方法和参数的使用方法

Java 方法 简介 方法是一块仅在调用时运行的代码。您可以将数据&#xff08;称为参数&#xff09;传递到方法中。方法用于执行特定的操作&#xff0c;它们也被称为函数。 使用方法的原因 重用代码&#xff1a;定义一次代码&#xff0c;多次使用。提高代码的结构化和可读性。…

聊聊xinput1_3.dll丢失的几种修复方式,xinput1_3.dll文件的作用和重要性

xinput1_3.dll丢失是一个常见且令人困扰的问题。xinput1_3.dll是一个重要的动态链接库文件&#xff0c;用于支持在Windows操作系统上运行的许多游戏和应用程序。当这个文件丢失或损坏时&#xff0c;用户可能会面临无法启动游戏或应用程序的困境。接下来就和大家聊聊xinput1_3.d…

【前端工程化面试题】webpack的module、bundle、chunk分别指的是什么?

首先从语法方面 在配置文件中有 module 这个配置项&#xff0c;里面有 rules 选项用来配置各种 loader&#xff0c;还有其他各种选项&#xff0c;参考官网。bundle 和 chunk 在配置文件中是没有这个选项的&#xff0c;但是会出现在配置的值中。 module 模块 指单个文件&#xf…

SQL29 计算用户的平均次日留存率(lead函数的用法)

代码 with t1 as(select distinct device_id,date --去重防止单日多次答题的情况from question_practice_detail ) select avg(if(datediff(date2,date1)1,1,0)) as avg_ret from (selectdistinct device_id,date as date1,lead(date) over(partition by device_id order by d…

机器猜想的数学原理

国内的那些资金密集型的IT企业认为要突破人工智能的极限&#xff0c;需要进行大力度的投资 比如说&#xff0c;购买海量的GPU和AI芯片来完成基于算力的人工智能系统&#xff0c;而我们这些没有什么 钱的小作坊就不能够走这条路&#xff0c;我们必须寻求巧妙的算法设计和构建精…

ChatGPT的大致原理

国外有个博主写了一篇博文&#xff0c;名字叫TChatGPT: Explained to KidsQ」&#xff0c; 直译过来就是&#xff0c;给小孩子解释什么是ChatGPT。 因为现实是很多的小孩子已经可以用父母的手机版ChatGPT玩了 &#xff0c;ChatGPT几乎可以算得上无所不知&#xff0c;起码给小孩…