天天看點

android 垂直循環滾動字幕,上下滾動字幕(示例代碼)

packagecom.example.animtextview;importandroid.content.Context;importandroid.content.res.TypedArray;importandroid.graphics.Camera;importandroid.graphics.Color;importandroid.graphics.Matrix;importandroid.util.AttributeSet;importandroid.view.Gravity;importandroid.view.View;importandroid.view.animation.AccelerateInterpolator;importandroid.view.animation.Animation;importandroid.view.animation.Transformation;importandroid.widget.TextSwitcher;importandroid.widget.TextView;importandroid.widget.ViewSwitcher;

public class AutoTextView extends TextSwitcher implementsViewSwitcher.ViewFactory {private floatmHeight;privateContext mContext;//mInUp,mOutUp分别構成向下翻頁的進出動畫

privateRotate3dAnimation mInUp;privateRotate3dAnimation mOutUp;//mInDown,mOutDown分别構成向下翻頁的進出動畫

privateRotate3dAnimation mInDown;privateRotate3dAnimation mOutDown;publicAutoTextView(Context context) {this(context, null);//TODO Auto-generated constructor stub

}publicAutoTextView(Context context, AttributeSet attrs) {super(context, attrs);//TODO Auto-generated constructor stub

TypedArray a =context.obtainStyledAttributes(attrs, R.styleable.auto3d);//mHeight = a.getDimension(R.styleable.auto3d_textSize, 36);

mHeight=20;

a.recycle();

mContext=context;

init();

}private voidinit() {//TODO Auto-generated method stub

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将執行OutAnimation

setInAnimation(mInUp);

setOutAnimation(mOutUp);

}private Rotate3dAnimation createAnim(float start, float end, boolean turnIn, booleanturnUp){final Rotate3dAnimation rotation = newRotate3dAnimation(start, end, turnIn, turnUp);//動畫持續時間

rotation.setDuration(300);

rotation.setFillAfter(false);

rotation.setInterpolator(newAccelerateInterpolator());returnrotation;

}public voidsetData(){

}//這裡傳回的TextView,就是我們看到的View

@OverridepublicView makeView() {//TODO Auto-generated method stub

TextView t = newTextView(mContext);

t.setGravity(Gravity.CENTER);

t.setTextSize(mHeight);

t.setMaxLines(2);

t.setPadding(0, 5, 0, 5);//設定文字顔色

t.setTextColor(Color.WHITE);returnt;

}//定義動作,向下滾動翻頁

public voidprevious(){if(getInAnimation() !=mInDown){

setInAnimation(mInDown);

}if(getOutAnimation() !=mOutDown){

setOutAnimation(mOutDown);

}

}//定義動作,向上滾動翻頁

public voidnext(){if(getInAnimation() !=mInUp){

setInAnimation(mInUp);

}if(getOutAnimation() !=mOutUp){

setOutAnimation(mOutUp);

}

}class Rotate3dAnimation extendsAnimation {private final floatmFromDegrees;private final floatmToDegrees;private floatmCenterX;private floatmCenterY;private final booleanmTurnIn;private final booleanmTurnUp;privateCamera mCamera;public Rotate3dAnimation(float fromDegrees, float toDegrees, boolean turnIn, booleanturnUp) {

mFromDegrees=fromDegrees;

mToDegrees=toDegrees;

mTurnIn=turnIn;

mTurnUp=turnUp;

}

@Overridepublic void initialize(int width, int height, int parentWidth, intparentHeight) {super.initialize(width, height, parentWidth, parentHeight);

mCamera= newCamera();

mCenterY= getHeight() / 2;

mCenterX= getWidth() / 2;

}

@Overrideprotected void applyTransformation(floatinterpolatedTime, Transformation t) {final float fromDegrees =mFromDegrees;float degrees = fromDegrees + ((mToDegrees - fromDegrees) *interpolatedTime);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.rotateX(degrees);

camera.getMatrix(matrix);

camera.restore();

matrix.preTranslate(-centerX, -centerY);

matrix.postTranslate(centerX, centerY);

}

}

}