当前位置:主页 > 移动开发 > Android代码 >

Android实现文字滚动效果

时间:2020-12-11 20:29:41 | 栏目:Android代码 | 点击:

Android 实现文字滚动效果,自己写了个timer小计时器,textview文字上下翻动效果:

public class AutoTextView extends TextSwitcher implements
  ViewSwitcher.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);
  // TODO Auto-generated constructor stub
 }

 public AutoTextView(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, 16);
  a.recycle();
  mContext = context;
  init();
 }

 private void init() {
  // 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, boolean turnUp){
  final Rotate3dAnimation rotation = new Rotate3dAnimation(start, end, turnIn, turnUp);
  rotation.setDuration(800);
  rotation.setFillAfter(false);
  rotation.setInterpolator(new AccelerateInterpolator());
  return rotation;
 }

 //这里返回的TextView,就是我们看到的View
 @Override
 public View makeView() {
  // TODO Auto-generated method stub
  TextView t = new TextView(mContext);
  t.setGravity(Gravity.CENTER);
  t.setTextSize(16);
  t.setMaxLines(1);
  t.setTextColor(mContext.getResources().getColor(R.color.textColor));
  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);
  }
 }
 
 class Rotate3dAnimation extends Animation {
   private final float mFromDegrees;
   private final float mToDegrees;
   private float mCenterX;
   private float mCenterY;
   private final boolean mTurnIn;
   private final boolean mTurnUp;
   private Camera mCamera;

   public Rotate3dAnimation(float fromDegrees, float toDegrees, boolean turnIn, boolean turnUp) {
    mFromDegrees = fromDegrees;
    mToDegrees = toDegrees;
    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() / 2;
    mCenterX = getWidth() / 2;
   }
   
   @Override
   protected void applyTransformation(float interpolatedTime, 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);
   }
 }

demo下载链接:http://xiazai.jb51.net/201611/yuanma/AndroidTextView(jb51.net).rar

您可能感兴趣的文章:

相关文章