android 自定义TextView,内容指定位置滚动动画效果

本文介绍了一个自定义的Android TextView类,该类实现了文字渐显动画效果。通过设置属性可以控制动画开始位置、每帧更新时间间隔及是否启动动画。文章详细展示了如何在XML布局文件中配置这些属性。
摘要由CSDN通过智能技术生成
public class MyTextView extends TextView {

    /*动画开始的位置*/
    private int mTextStartIndex;
    /*每次动画执行的间隔 事件*/
    private int mEverySpaceTime;
    private String mTextContent;
    private String mSubTextContent;
    private boolean mIsStartAnimation;
    private ShowTextThread mShowTextThread;

    private int mViewVisiblity;
    private int mWindowVisiblity;
    private volatile boolean mViewVisible;

    public MyTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(attrs);
        setTextStyle(context);

        mTextContent = (String)getText();
        if (mIsStartAnimation) {
            mSubTextContent = mTextContent;
        }else{
            mSubTextContent = mTextContent.substring(0, mTextStartIndex);
        }
        
    }

    
    public boolean ismIsStartAnimation() {
        return mIsStartAnimation;
    }


    public void setmIsStartAnimation(boolean mIsStartAnimation) {
        this.mIsStartAnimation = mIsStartAnimation;
    }


    public int getmTextStartIndex() {
        return mTextStartIndex;
    }

    public void setmTextStartIndex(int mTextStartIndex) {
        this.mTextStartIndex = mTextStartIndex;
    }

    public int getmEverySpaceTime() {
        return mEverySpaceTime;
    }

    public void setmEverySpaceTime(int mEverySpaceTime) {
        this.mEverySpaceTime = mEverySpaceTime;
    }

    private void init(AttributeSet attrs) {
        TypedArray t = getContext().obtainStyledAttributes(attrs, R.styleable.NewTextViewElement);
        mEverySpaceTime = t.getInteger(R.styleable.NewTextViewElement_spaceTime, 300);
        mTextStartIndex = t.getInteger(R.styleable.NewTextViewElement_animationStartIndex, 1);
        mIsStartAnimation = t.getBoolean(R.styleable.NewTextViewElement_isStartAnimation, false);
        t.recycle();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        setText(mSubTextContent);
        super.onDraw(canvas);
    }

    class ShowTextThread extends Thread {
        public void run() {
            changeText();
        }

        private void changeText() {
            final int text_length = getText().length();
            if (mTextStartIndex > (text_length - 1)) {
                return;
            }
            int currentIndex = mTextStartIndex;
            while (true) {
                
                if (!mViewVisible) {
                    break;
                }
                mSubTextContent = mTextContent.substring(0, currentIndex);
                postInvalidate();
                if (currentIndex == text_length) {
                    currentIndex = mTextStartIndex;
                } else {
                    currentIndex++;
                }

                try {
                    sleep(mEverySpaceTime);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * the index will not should at first
     *
     * @param index
     */
    public void setAnimationTextStartIndex(int index) {
        mTextStartIndex = index;
    }

    private void setTextStyle(Context context) {
        AssetManager mgr = context.getAssets();
        Typeface createFromAsset = Typeface.createFromAsset(mgr, "yf.ttf");
        setTypeface(createFromAsset);
    }

    @Override
    protected void onWindowVisibilityChanged(int visibility) {
        super.onWindowVisibilityChanged(visibility);
        mWindowVisiblity = visibility;
        viewVisiblityChanged();
    }

    @Override
    protected void onVisibilityChanged(View changedView, int visibility) {
        super.onVisibilityChanged(changedView, visibility);
        mViewVisiblity = visibility;
        viewVisiblityChanged();
    }

    private void viewVisiblityChanged() {
        boolean visible = (mViewVisiblity | mWindowVisiblity) == View.VISIBLE;
        if (visible == mViewVisible) {
            return;
        }
        mViewVisible = visible;
        if (mViewVisible&&mIsStartAnimation) {
//            if (mShowTextThread == null) {
//                mShowTextThread = new ShowTextThread();
//                mShowTextThread.start();
//            }
//        } else {
//            if (mShowTextThread != null) {
//                mShowTextThread.interrupt();
//            }
            
            new Thread(){
                public void run() {
                    changeText();
                }

                private void changeText() {
                    final int text_length = getText().length();
                    if (mTextStartIndex > (text_length - 1)) {
                        return;
                    }
                    int currentIndex = mTextStartIndex;
                    while (true) {
                        
                        if (!mViewVisible) {
                            break;
                        }
                        mSubTextContent = mTextContent.substring(0, currentIndex);
                        postInvalidate();
                        if (currentIndex == text_length) {
                            currentIndex = mTextStartIndex;
                        } else {
                            currentIndex++;
                        }

                        try {
                            sleep(mEverySpaceTime);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }.start();
        }
    }

}




xmlns:xsetting="http://schemas.android.com/apk/res/com.itshow"

//xmlns:xsetting="http://schemas.android.com/apk/res/包名"

        <com.itshow.view.MyTextView
            android:layout_width="170px"
            android:layout_height="wrap_content"
            android:text="@string/xxx"       如:123456789
            xsetting:animationStartIndex="3"
            xsetting:isStartAnimation="true"
            xsetting:spaceTime="500" />







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值