TextView上下滚动

Posted tyuioweb

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TextView上下滚动相关的知识,希望对你有一定的参考价值。

[plain] view plaincopy
 
  1. public class AutoTextView extends TextSwitcher implements ViewFactory {  
  2.   
  3. private float mHeight;  
  4. private Context mContext;  
  5. //mInUp,mOutUp分别构成向下翻页的进出动  
  6. private Rotate3dAnimation mInUp;  
  7. private Rotate3dAnimation mOutUp;  
  8. final int[] auto3d = {  
  9. 0x7f010000  
  10. };  
  11. //mInDown,mOutDown分别构成向下翻页的进出动  
  12. private Rotate3dAnimation mInDown;  
  13. private Rotate3dAnimation mOutDown;  
  14.   
  15. public AutoTextView(Context context) {  
  16. this(context, null);  
  17. }  
  18.   
  19. public AutoTextView(Context context, AttributeSet attrs) {  
  20. super(context, attrs);  
  21. TypedArray a = context.obtainStyledAttributes(attrs, auto3d);  
  22. mHeight = a.getDimension(0, 15);  
  23. a.recycle();  
  24. mContext = context;  
  25. init();  
  26. }  
  27.   
  28. private void init() {  
  29. setFactory(this);  
  30. mInUp = createAnim(-90, 0, true, true);  
  31. mOutUp = createAnim(0, 90, false, true);  
  32. mInDown = createAnim(90, 0, true, false);  
  33. mOutDown = createAnim(0, -90, false, false);  
  34. //TextSwitcher主要用于文件切换,比?? 从文字A 切换?? 文字 B??  
  35. //setInAnimation()后,A将执行inAnimation??  
  36. //setOutAnimation()后,B将执行OutAnimation  
  37. setInAnimation(mInUp);  
  38. setOutAnimation(mOutUp);  
  39. }  
  40.   
  41. private Rotate3dAnimation createAnim(float start, float end, boolean turnIn, boolean turnUp) {  
  42. final Rotate3dAnimation rotation = new Rotate3dAnimation(start, end, turnIn, turnUp);  
  43. rotation.setDuration(300);  
  44. rotation.setFillAfter(false);  
  45. rotation.setInterpolator(new AccelerateInterpolator());  
  46. return rotation;  
  47. }  
  48.   
  49. //这里返回的TextView,就是我们看到的View  
  50. @Override  
  51. public View makeView() {  
  52. TextView t = new TextView(mContext);  
  53. t.setGravity(Gravity.CENTER);  
  54. t.setTextSize(mHeight);  
  55. t.setSingleLine(true);  
  56. t.setTextColor(R.color.black);  
  57. return t;  
  58. }  
  59.   
  60. //定义动作,向下滚动翻??  
  61. public void previous() {  
  62. if (getInAnimation() != mInDown) {  
  63. setInAnimation(mInDown);  
  64. }  
  65. if (getOutAnimation() != mOutDown) {  
  66. setOutAnimation(mOutDown);  
  67. }  
  68. }  
  69.   
  70. //定义动作,向上滚动翻??  
  71. public void next() {  
  72. if (getInAnimation() != mInUp) {  
  73. setInAnimation(mInUp);  
  74. }  
  75. if (getOutAnimation() != mOutUp) {  
  76. setOutAnimation(mOutUp);  
  77. }  
  78. }  
  79.   
  80. class Rotate3dAnimation extends Animation {  
  81. private final float mFromDegrees;  
  82. private final float mToDegrees;  
  83. private final boolean mTurnIn;  
  84. private final boolean mTurnUp;  
  85. private float mCenterX;  
  86. private float mCenterY;  
  87. private Camera mCamera;  
  88.   
  89. public Rotate3dAnimation(float fromDegrees, float toDegrees, boolean turnIn, boolean turnUp) {  
  90. mFromDegrees = fromDegrees;  
  91. mToDegrees = toDegrees;  
  92. mTurnIn = turnIn;  
  93. mTurnUp = turnUp;  
  94. }  
  95.   
  96. @Override  
  97. public void initialize(int width, int height, int parentWidth, int parentHeight) {  
  98. super.initialize(width, height, parentWidth, parentHeight);  
  99. mCamera = new Camera();  
  100. mCenterY = getHeight() / 2;  
  101. mCenterX = getWidth() / 2;  
  102. }  
  103.   
  104. @Override  
  105. protected void applyTransformation(float interpolatedTime, Transformation t) {  
  106. final float fromDegrees = mFromDegrees;  
  107. float degrees = fromDegrees + ((mToDegrees - fromDegrees) * interpolatedTime);  
  108.   
  109. final float centerX = mCenterX;  
  110. final float centerY = mCenterY;  
  111. final Camera camera = mCamera;  
  112. final int derection = mTurnUp ? 1 : -1;  
  113.   
  114. final Matrix matrix = t.getMatrix();  
  115.   
  116. camera.save();  
  117. if (mTurnIn) {  
  118. camera.translate(0.0f, derection * mCenterY * (interpolatedTime - 1.0f), 0.0f);  
  119. else {  
  120. camera.translate(0.0f, derection * mCenterY * (interpolatedTime), 0.0f);  
  121. }  
  122. camera.rotateX(degrees);  
  123. camera.getMatrix(matrix);  
  124. camera.restore();  
  125.   
  126. matrix.preTranslate(-centerX, -centerY);  
  127. matrix.postTranslate(centerX, centerY);  
  128. }  
  129. }  
  130. }  

第二步,这里写个Handler来循环滚动TextView内容

[plain] view plaincopy
 
  1. private Handler handler = new Handler() {  
  2. public void handleMessage(android.os.Message msg) {  
  3.   
  4. switch (msg.what) {  
  5. case 1001:  
  6. handler.sendEmptyMessageDelayed(1001, 4000);  
  7. mStringArray = new ArrayList<>();  
  8. mStringArray.add("滚动字体一");  
  9. mStringArray.add("滚动字体二");  
  10. if (mStringArray.size() != 0) {  
  11. int i = mLoopCount % mStringArray.size();  
  12. tv_main_inform.next();  
  13. tv_main_inform.setText(mStringArray.get(i));  
  14. mLoopCount++;  
  15. // handler.sendEmptyMessageDelayed(FLAG, 5000);  
  16. }  
  17. break;  
  18. }  
  19. };  
  20. };  

这里写的这个handler有点麻烦了,后面我用了一个新写法:

[plain] view plaincopy
 
  1. mStringArray = new ArrayList<>();  
  2. mStringArray.add("滚动字体一");  
  3. mStringArray.add("滚动字体二");  
  4. Observable.interval(0, 4, TimeUnit.SECONDS).subscribe {  
  5.   
  6. if (mStringArray.size() != 0) {  
  7. int i = mLoopCount % mStringArray.size();  
  8. tv_main_inform.next();  
  9. tv_main_inform.setText(mStringArray.get(i));  
  10. mLoopCount++;  
  11. // handler.sendEmptyMessageDelayed(FLAG, 5000);  
  12. }}  

以上是关于TextView上下滚动的主要内容,如果未能解决你的问题,请参考以下文章

android 实现多textview的滚动

当滚动超出最初可见的范围时,无法访问 recyclerview 中的 textview

android stuido控件

TextView系列:TextView设置滚动

TextView 滚动不顺畅

TextView滚动如何实现