Android 上下滚动字幕实现
生活随笔
收集整理的這篇文章主要介紹了
Android 上下滚动字幕实现
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
首先values文件夾下添加或創(chuàng)建attrs文件,如下:
?
<?xml version="1.0" encoding="utf-8"?> <resources><!--//垂直滾動字幕--><declare-styleable name="VerticalRollingTextView"><!--文字顏色--><attr name="android:textColor"/><!--文字大小--><attr name="android:textSize"/><!--滾動動畫時長--><attr name="android:duration"/><!--兩次動畫之間的間隔--><attr name="animInterval" format="integer"/></declare-styleable></resources>?
1、自定義上下滾動字幕textview、VerticalRollingTextView
/*** 作者:created by meixi* 郵箱:13164716840@163.com* 日期:2018/8/30 10*/public class VerticalRollingTextView extends View {DataSetAdapter mDataSetAdapter;private final Paint mPaint;private int mCurrentIndex;private int mNextIndex;Rect bounds = new Rect();private float mCurrentOffsetY;private float mOrgOffsetY = -1;private final float mTextTopToAscentOffset;private float mOffset;private InternalAnimation mAnimation = new InternalAnimation();/*防止動畫結(jié)束的回調(diào)觸發(fā)以后動畫繼續(xù)進行出現(xiàn)的錯亂問題*/private boolean mAnimationEnded;private boolean isRunning;/*動畫時間*/private int mDuration = 1000;/*動畫間隔*/private int mAnimInterval = 5000;public VerticalRollingTextView(Context context, AttributeSet attrs) {super(context, attrs);mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);mPaint.setColor(Color.BLACK);mPaint.setTypeface(Typeface.DEFAULT);parseAttrs(context, attrs);Paint.FontMetricsInt metricsInt = mPaint.getFontMetricsInt();mTextTopToAscentOffset = metricsInt.ascent - metricsInt.top;mAnimation.setDuration(mDuration);}private void parseAttrs(Context context, AttributeSet attrs) {float density = getResources().getDisplayMetrics().density;TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.VerticalRollingTextView);mPaint.setColor(typedArray.getColor(R.styleable.VerticalRollingTextView_android_textColor, Color.BLACK));mPaint.setTextSize(typedArray.getDimensionPixelOffset(R.styleable.VerticalRollingTextView_android_textSize, (int) (density * 14)));mDuration = typedArray.getInt(R.styleable.VerticalRollingTextView_android_duration, mDuration);mAnimInterval = typedArray.getInt(R.styleable.VerticalRollingTextView_animInterval, mAnimInterval);typedArray.recycle();}@Overrideprotected void onDraw(Canvas canvas) {// 繪制文本if (mDataSetAdapter == null || mDataSetAdapter.isEmpty()) {return;}String text1 = mDataSetAdapter.getText(mCurrentIndex);String text2 = mDataSetAdapter.getText(mNextIndex);//只需要進行一次測量if (mOrgOffsetY == -1) {mPaint.getTextBounds(text1, 0, text1.length(), bounds);mOffset = (getHeight() + bounds.height()) * 0.5f;mOrgOffsetY = mCurrentOffsetY = mOffset - mTextTopToAscentOffset;mAnimation.updateValue(mOrgOffsetY, -2 * mTextTopToAscentOffset);}canvas.drawText(text1, 0, mCurrentOffsetY, mPaint);canvas.drawText(text2, 0, mCurrentOffsetY + mOffset + mTextTopToAscentOffset, mPaint);}public void setDataSetAdapter(DataSetAdapter dataSetAdapter) {mDataSetAdapter = dataSetAdapter;confirmNextIndex();invalidate();}/*** 開始轉(zhuǎn)動,界面可見的時候調(diào)用*/public void run() {if (isRunning) {return;}isRunning = true;mAnimation.updateValue(mCurrentOffsetY, -2 * mTextTopToAscentOffset);post(mRollingTask);}/*** @return true代表正在轉(zhuǎn)動*/public boolean isRunning() {return isRunning;}/*** 停止轉(zhuǎn)動,界面不可見的時候調(diào)用*/public void stop() {isRunning = false;removeCallbacks(mRollingTask);}Runnable mRollingTask = new Runnable() {@Overridepublic void run() {mAnimationEnded = false;startAnimation(mAnimation);postDelayed(this, mAnimInterval);}};public void animationEnd() {//1.角標+1mCurrentIndex++;//2.計算出正確的角標mCurrentIndex = mCurrentIndex < mDataSetAdapter.getItemCount() ? mCurrentIndex : mCurrentIndex % mDataSetAdapter.getItemCount();//3.計算下一個待顯示文字角標confirmNextIndex();//3.位置復(fù)位mCurrentOffsetY = mOrgOffsetY;mAnimationEnded = true;}@Overrideprotected void onDetachedFromWindow() {super.onDetachedFromWindow();removeCallbacks(mRollingTask);if (isRunning()) {mAnimation.cancel();}}/*** 計算第二個角標*/private void confirmNextIndex() {//3.計算第二個角標mNextIndex = mCurrentIndex + 1;//4.計算出正確的第二個角標mNextIndex = mNextIndex < mDataSetAdapter.getItemCount() ? mNextIndex : 0;}/*** float估值器** @param fraction* @param startValue* @param endValue* @return*/float evaluate(float fraction, float startValue, float endValue) {return startValue + fraction * (endValue - startValue);}@Overridepublic void setOnClickListener(OnClickListener l) {}public void setOnItemClickListener(final OnItemClickListener onItemClickListener) {super.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {onItemClickListener.onItemClick(VerticalRollingTextView.this, mCurrentIndex);}});}public interface OnItemClickListener {void onItemClick(VerticalRollingTextView view, int index);}class InternalAnimation extends Animation {float startValue;float endValue;@Overrideprotected void applyTransformation(float interpolatedTime, Transformation t) {if (mAnimationEnded) return;mCurrentOffsetY = evaluate(interpolatedTime, startValue, endValue);if (mCurrentOffsetY == endValue) {try {animationEnd();}catch (Exception e) {e.printStackTrace();}}postInvalidate();}public void updateValue(float startValue, float endValue) {this.startValue = startValue;this.endValue = endValue;}}}2、layout.xml文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout 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=".MainActivity"><com.administrator.tests.VerticalRollingTextViewandroid:layout_width="match_parent"android:layout_height="40dp"android:background="@color/numtext"android:textColor="@color/colorAccent"android:id="@+id/myvtext"/></LinearLayout>3、activity調(diào)用自定義textview賦值
VerticalRollingTextView verticalRollingTextView = (VerticalRollingTextView)findViewById(R.id.myvtext);TestEntity testEntity = new TestEntity();testEntity.setHttps("baidu.com");testEntity.setTitle("百度。com");TestEntity testEntity1 = new TestEntity();testEntity1.setTitle("谷歌。com");testEntity1.setHttps("guge.com");testEntities.add(testEntity);testEntities.add(testEntity1);verticalRollingTextView.setDataSetAdapter(new DataSetAdapter<TestEntity>(testEntities) {@Overrideprotected String text(TestEntity s) {return s.getTitle();} }); verticalRollingTextView.run(); verticalRollingTextView.setOnItemClickListener(new VerticalRollingTextView.OnItemClickListener() {@Overridepublic void onItemClick(VerticalRollingTextView view, int index) {//點擊鏈接String url = testEntities.get(index).getHttps();Toast.makeText(MainActivity.this,url,Toast.LENGTH_LONG).show();} });?
總結(jié)
以上是生活随笔為你收集整理的Android 上下滚动字幕实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: shiro 角色与权限的解读
- 下一篇: Android LinearLayout