自定义AutoTextView实现公告栏 文字3D 翻转动画
生活随笔
收集整理的這篇文章主要介紹了
自定义AutoTextView实现公告栏 文字3D 翻转动画
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
對于抽獎頁 我們都用到了公告欄循環播放中獎名單的動畫效果;一下介紹下自定義AutoTextView?實現了公告欄 文字 3D 翻轉動畫效果,無限循環播放,具有向上或者向下翻轉特效。
現在先上效果圖:
下面附上代碼介紹:
自定義AutoTextView繼承自TextSwitcher,實現文字切換,自定義動畫,實現3d動畫效果;
class Rotate3dAnimation extends Animation {private final float mFromDegrees; //初始值private final float mToDegrees; //最終值private final boolean mTurnIn; //進private final boolean mTurnUp; //出private float mCenterX;private float mCenterY;private Camera mCamera;public Rotate3dAnimation(float fromDegrees, float toDegrees, boolean turnIn, boolean turnUp) {mFromDegrees = fromDegrees;mToDegrees = toDegrees;mTurnIn = turnIn;mTurnUp = turnUp;}//初始化動作@Overridepublic void initialize(int width, int height, int parentWidth, int parentHeight) {super.initialize(width, height, parentWidth, parentHeight);mCamera = new Camera();mCenterY = getHeight() / 2;mCenterX = getWidth() / 2;}//定義動畫效果@Overrideprotected void applyTransformation(float interpolatedTime, Transformation t) {final float fromDegrees = mFromDegrees;//當前值 = 初始值 + (最終值 - 初始值) * interpolatedTime;float degrees = fromDegrees + ((mToDegrees - fromDegrees) * interpolatedTime);final float centerX = mCenterX;final float centerY = mCenterY;final Camera camera = mCamera;final int derection = mTurnUp ? 1 : -1;//通過camera進行一些矩陣操作,最后對matrix進行變化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.rotateX(degrees);camera.getMatrix(matrix);camera.restore();matrix.preTranslate(-centerX, -centerY);matrix.postTranslate(centerX, centerY);}}重新定義了一個Animation,覆寫了initialize和applyTransformation方法,利用矩陣實現3D翻頁特效
下面附上整體代碼:
public class AutoTextView extends TextSwitcher implements ViewFactory {private float mHeight;private Context mContext;//mInUp,mOutUp分別構成向上翻頁的進出動畫private Rotate3dAnimation mInUp;private Rotate3dAnimation mOutUp;//mInDown,mOutDown分別構成向下翻頁的進出動畫private Rotate3dAnimation mInDown;private Rotate3dAnimation mOutDown;public AutoTextView(Context context) {this(context, null);}public AutoTextView(Context context, AttributeSet attrs) {super(context, attrs);TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.auto3d);mHeight = a.getDimension(R.styleable.auto3d_textSize, 36);a.recycle();mContext = context;init();}private void init() {setFactory(this);//向上翻頁的進出動畫mInUp = createAnim(-90, 0, true, true);//進動畫mOutUp = createAnim(0, 90, false, true);//出動畫//向下翻頁的進出動畫mInDown = createAnim(90, 0, true, false);mOutDown = createAnim(0, -90, false, false);//繼承TextSwitcher主要用于文件切換,比如 從文字A 切換到 文字 B,//setInAnimation()后,A將執行inAnimation,//setOutAnimation()后,B將執行OutAnimationsetInAnimation(mInUp);setOutAnimation(mOutUp);}//動畫private Rotate3dAnimation createAnim(float start, float end, boolean turnIn, boolean turnUp) {final Rotate3dAnimation rotation = new Rotate3dAnimation(start, end, turnIn, turnUp);//設置動畫持續時間rotation.setDuration(300);//fillAfter設為true,則動畫執行后,控件將停留在動畫結束的狀態,false 則不停留rotation.setFillAfter(false);//設置動畫的變化速度 加速rotation.setInterpolator(new AccelerateInterpolator());return rotation;}//這里返回的TextView,就是我們看到的View@Overridepublic View makeView() {TextView t = new TextView(mContext);t.setGravity(Gravity.CENTER);t.setTextSize(mHeight);t.setSingleLine(true);return t;}//定義動作,向下滾動翻頁public void previous() {if (getInAnimation() != mInDown) {setInAnimation(mInDown);}if (getOutAnimation() != mOutDown) {setOutAnimation(mOutDown);}}//定義動作,向上滾動翻頁public void next() {if (getInAnimation() != mInUp) {setInAnimation(mInUp);}if (getOutAnimation() != mOutUp) {setOutAnimation(mOutUp);}}/*** 3d動畫* 重新定義了一個Animation,覆寫了initialize和applyTransformation方法*/class Rotate3dAnimation extends Animation {private final float mFromDegrees; //初始值private final float mToDegrees; //最終值private final boolean mTurnIn; //進private final boolean mTurnUp; //出private float mCenterX;private float mCenterY;private Camera mCamera;public Rotate3dAnimation(float fromDegrees, float toDegrees, boolean turnIn, boolean turnUp) {mFromDegrees = fromDegrees;mToDegrees = toDegrees;mTurnIn = turnIn;mTurnUp = turnUp;}//初始化動作@Overridepublic void initialize(int width, int height, int parentWidth, int parentHeight) {super.initialize(width, height, parentWidth, parentHeight);mCamera = new Camera();mCenterY = getHeight() / 2;mCenterX = getWidth() / 2;}//定義動畫效果@Overrideprotected void applyTransformation(float interpolatedTime, Transformation t) {final float fromDegrees = mFromDegrees;//當前值 = 初始值 + (最終值 - 初始值) * interpolatedTime;float degrees = fromDegrees + ((mToDegrees - fromDegrees) * interpolatedTime);final float centerX = mCenterX;final float centerY = mCenterY;final Camera camera = mCamera;final int derection = mTurnUp ? 1 : -1;//通過camera進行一些矩陣操作,最后對matrix進行變化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.rotateX(degrees);camera.getMatrix(matrix);camera.restore();matrix.preTranslate(-centerX, -centerY);matrix.postTranslate(centerX, centerY);}} }在activity中:
添加公告欄數據:
// 數據mStringArray = new ArrayList<String>();mStringArray.add("137****1111 獲得一等獎");mStringArray.add("137****2222 獲得二等獎");mStringArray.add("137****3333 獲得三等獎");mStringArray.add("137****4444 獲得四等獎");通過headler發送消息開始自動翻轉:
//開始動畫button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (mEventHandler == null){mEventHandler = new EventHandler(MainActivity.this);//Value為FLAG的消息延遲0.5秒mEventHandler.sendEmptyMessageDelayed(FLAG, 500);}}}); public static class EventHandler extends Handler {private WeakReference<MainActivity> wr;public EventHandler(MainActivity r) {wr = new WeakReference<MainActivity>(r);}@Overridepublic void handleMessage(android.os.Message msg) {MainActivity activity = wr.get();switch (msg.what) {case 1:if (activity.mStringArray.size()!= 0){//無限循環int i = activity.mLoopCount % activity.mStringArray.size();// 向上滾動翻頁activity.mAutoTextView.next();//給AutoTextView 設置文字activity.mAutoTextView.setText(activity.mStringArray.get(i));activity.mLoopCount ++;//Value為FLAG的消息延遲0.5秒activity.mEventHandler.sendEmptyMessageDelayed(FLAG, 500);}break;}}}在頁面結束時一定要釋放掉handler:
//停止動畫,釋放handlerbutton1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (mEventHandler != null){//移出消息mEventHandler.removeMessages(FLAG);mEventHandler = null;}}});xml文件:
<com.ss.autotextview.AutoTextViewandroid:id="@+id/id_main_switcher"android:layout_width="match_parent"android:layout_height="50dp"auto3d:textSize="10sp" />注意 ?一定要在布局文件的父控件添加:
xmlns:auto3d="http://schemas.android.com/apk/res-auto"下面附上demo下載地址:
https://download.csdn.net/download/shanshan_1117/10315694
點擊打開鏈接
總結
以上是生活随笔為你收集整理的自定义AutoTextView实现公告栏 文字3D 翻转动画的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Swift】401状态处理流程
- 下一篇: 《java websocket》之 实现