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://download.csdn.net/detail/u011275152/9696827

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android实现 TextView 文字滚动可以使用以下两种方式: 一、使用 Marquee(跑马灯)属性 在布局文件中的 TextView 中添加以下属性: ``` <TextView android:id="@+id/text_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="这是一段需要滚动文字这是一段需要滚动文字这是一段需要滚动文字" android:singleLine="true" android:ellipsize="marquee" android:focusable="true" android:focusableInTouchMode="true" android:marqueeRepeatLimit="marquee_forever" android:scrollHorizontally="true" android:padding="5dp" android:textColor="#000000" android:textSize="20sp" /> ``` 其中,关键属性为: - android:ellipsize="marquee":当文字超出 TextView 的宽度时,显示省略号并开启跑马灯效果。 - android:focusable="true" 和 android:focusableInTouchMode="true":设置为可获得焦点,让 TextView 能够滚动。 - android:marqueeRepeatLimit="marquee_forever":设置跑马灯无限循环。 - android:scrollHorizontally="true":可水平滚动。 在 Java 代码中,调用 setHorizontallyScrolling() 方法也可以实现水平滚动,示例代码如下: ``` TextView textView = findViewById(R.id.text_view); textView.setHorizontallyScrolling(true); ``` 二、使用代码实现 在 Java 代码中使用 TextView 的 setEllipsize() 方法和 setMarqueeRepeatLimit() 方法可以实现 TextView文字滚动效果。示例代码如下: ``` TextView textView = findViewById(R.id.text_view); textView.setText("这是一段需要滚动文字这是一段需要滚动文字这是一段需要滚动文字"); textView.setSingleLine(true); textView.setEllipsize(TextUtils.TruncateAt.MARQUEE); textView.setMarqueeRepeatLimit(-1); textView.setFocusable(true); textView.setFocusableInTouchMode(true); textView.requestFocus(); ``` 需要注意的是,如果在代码中设置了跑马灯效果,还需要在布局文件中设置以下属性: ``` android:singleLine="true" android:scrollHorizontally="true" ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值