• 82、文字混动效果


    第一种方式实现:ListView + Timer  ,简单,但是效果生硬。

    <ListView
            android:id="@+id/lv_news"
            android:layout_width="wrap_content"
            android:layout_height="0dip"
            android:fadeScrollbars="true"
            android:layout_alignBottom="@id/txt_home_news_ico"
            android:layout_alignTop="@id/txt_home_news_ico"
            android:layout_marginLeft="10dp"
            android:cacheColorHint="#00000000"
            android:divider="@null"
            android:layout_toRightOf="@id/txt_home_news_ico"
            android:background="@color/transparent"
            android:scrollbars="none" />
     1 private ListView lv_news = null;
     2 private int myIndex = 0;
     3 
     4 *******   省略
     5 
     6 if (listNewsAll.size() > 1) {
     7             new Timer().schedule(new TimerTask() {
     8                 @Override
     9                 public void run() {
    11                     myIndex += 1;
    14                     if (myIndex >= listNewsAll.size()) {
    15                         myIndex = 0;
    16                     }
    18                     lv_news.smoothScrollToPositionFromTop (myIndex, 2);
    20                 }
    21             }, 0, 2000);
    22         }
    23     }

    第二种方式实现:自定义控件 + handler。 有动画效果。

    import android.content.Context;
    import android.graphics.Camera;
    import android.graphics.Color;
    import android.graphics.Matrix;
    import android.util.AttributeSet;
    import android.view.Gravity;
    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;
    
    
    /**
     * 垂直翻滚
     */
    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, 36);
            mHeight = 20;
         //   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(300);
            rotation.setFillAfter(false);
            rotation.setInterpolator(new AccelerateInterpolator());
            return rotation;
        }
    
        public void setData() {
    
        }
    
        //这里返回的TextView,就是我们看到的View
        @Override
        public View makeView() {
            // TODO Auto-generated method stub
            TextView t = new TextView(mContext);
            t.setGravity(Gravity.CENTER);
            t.setTextSize(mHeight);
            t.setMaxLines(2);
            t.setPadding(0, 5, 0, 5);
            //设置文字颜色
            t.setTextColor(Color.WHITE);
            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);
            }
        }
    }
    <com.dr.mk.project.txt01.AutoTextView
                android:id="@+id/switcher02"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />
     1 public class TxtMainActivity extends Activity {
     2 
     3     private AutoTextView mTextView02;
     4     final Handler handler = new Handler();
     5     // 自定义信息条数
     6     private static int sCount = 0;
     7     private List<String> str = new ArrayList<String>();
     8 
     9     @Override
    10     protected void onCreate(Bundle savedInstanceState) {
    11         super.onCreate(savedInstanceState);
    12 
    13         setContentView(R.layout.activity_txt_fan_zhuan);
    14 
    15         init();
    16     }
    17 
    18     private void init() {
    19         //垂直滚动
    20         // 初始化数据
    21         str.add("信息1");
    22         str.add("信息2");
    23         str.add("信息3");
    24         sCount = str.size();
    25         mTextView02 = (AutoTextView) findViewById(R.id.switcher02);
    26         mTextView02.setText(str.get(0));
    27         //启动计时器
    28         handler.postDelayed(runnable, 3000);
    29         //handler.removeCallbacks(runnable);// 关闭定时器处理
    30     }
    31 
    32     Runnable runnable = new Runnable() {
    33         @Override
    34         public void run() {
    35             // 在此处添加执行的代码
    36             mTextView02.next();
    37             sCount++;
    38             if(sCount>=Integer.MAX_VALUE) {
    39                 sCount = str.size();
    40             }
    41             mTextView02.setText(str.get(sCount % (str.size())));
    42             if (str.size()>1) {
    43                 handler.postDelayed(this, 2000);// 50是延时时长
    44             }
    45 
    46         }
    47     };
    48 
    49 }
  • 相关阅读:
    DDD:四色原型中Role的 “六” 种实现方式
    .NET:脏读、不可重复读和幻读测试
    AIR:使用 HTML + Javascript 开发桌面应用
    Silverlight:《Pro Silverlight5》读书笔记 之 Layout
    设计原则:什么样的情况下需要引入父类?
    设计原则:不要为了复用而使用继承
    Ruby:字符集和编码学习总结
    .NET:字符集和编码学习总结
    Ruby:Sublime中开发Ruby需要注意的Encoding事项
    .NET:遇到并发问题,什么样的情况下需要自动重试?
  • 原文地址:https://www.cnblogs.com/androidsj/p/5377502.html
Copyright © 2020-2023  润新知