AutoTextView实现文字自动翻转效果

举报
再见孙悟空_ 发表于 2022/01/13 00:44:59 2022/01/13
【摘要】 效果图如上 代码如下: AutoTextView package com.jky.mobilebzt.view; import android.content.Context;import android.content.res.TypedArray;import android.graphics.Camera;import ...

效果图如上

代码如下:

AutoTextView

      package com.jky.mobilebzt.view;
      import android.content.Context;
      import android.content.res.TypedArray;
      import android.graphics.Camera;
      import android.graphics.Matrix;
      import android.text.TextUtils;
      import android.util.AttributeSet;
      import android.view.View;
      import android.view.animation.AccelerateInterpolator;
      import android.view.animation.Animation;
      import android.view.animation.Transformation;
      import android.widget.TextSwitcher;
      import android.widget.TextView;
      import android.widget.ViewSwitcher;
      import com.jky.mobilebzt.R;
      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);
          }
         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将执行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() {
             TextView t = new TextView(mContext);
      // t.setGravity(Gravity.CENTER);
              t.setTextSize(mHeight);
      // t.setTextColor(Resources.getSystem().getColor(android.R.color.black));
              t.setTextColor(mContext.getResources().getColor(R.color.white));
              t.setTextSize(13);
      // t.setGravity(Gravity.CENTER_VERTICAL);
              t.setPadding(0,15,0,15);
              t.setMaxLines(1);
              t.setEllipsize(TextUtils.TruncateAt.END);
             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);
              }
          }
      }
  
 

attrs.xml


        <declare-styleable name="auto3d">
             <attr name="textSize" format="dimension" />
         </declare-styleable>
  
 

xml


             <com.xx.xx.view.AutoTextView
                         android:id="@+id/atv_auto_qy"
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content"
                         android:layout_marginTop="@dimen/margin_5" />
  
 

activity


         private void showQyInfo() {
      // qyPowers.clear();
              isShowQyView = true;
              mQyInfoView.setVisibility(View.VISIBLE);
             if(timer == null){
                 String[] qyinfo = context.getResources().getStringArray(R.array.qy_power);
                  qyPowers = Arrays.asList(qyinfo);
                  timer = new Timer();
                  timer.schedule(timerTask, 100, 3000);
                  powerPosition = 0;
              }
          }
         //计时
         TimerTask timerTask = new TimerTask() {
             @Override
             public void run() {
                 if(isShowQyView) {
                     Message message = new Message();
                      message.what = 0x001;
                      handler.sendMessage(message);
                  }
              }
          };
          final Handler handler = new Handler() {
             @Override
             public void handleMessage(Message msg) {
                 switch (msg.what) {
                     case 0x001:
                          atvQy.next();
                          atvQy.setText(qyPowers.get(powerPosition));
                          powerPosition ++;
                          powerPosition = powerPosition % 3;
                  }
              }
          };
  
 

strings.xml


      <array name="qy_power">
             <item>8000+本建筑行业标准在线查看</item>
             <item>随时创建反馈,企业专家、云服务专家组、标准规范起草人为您解答</item>
             <item>移动课堂专享课程免费学习</item>
         </array>
  
 

文章来源: wukong.blog.csdn.net,作者:再见孙悟空_,版权归原作者所有,如需转载,请联系作者。

原文链接:wukong.blog.csdn.net/article/details/115464473

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。