当前位置:   article > 正文

类似淘宝的Text标签的来回滚动_tittle滚动

tittle滚动

       由于公司做的是商城类的app,有很多样式及功能都是借鉴的淘宝。近期,产品要求做一个类似淘宝一样的两个text标签来回的滚动,在网上也查阅了很多的资料,总感觉要么是比较的复杂化,要么就是达不到自己想要的效果,所以就自己动手码代码。

     先上效果图:


   模拟器的运行效果较差,再加上gif的录制,整体看起来不是很流畅,真机上跑起来比较流畅。

  技术要点:

        1  两套布局来回进行平移动画。

        2  两套布局的隐藏可见的控制。

        3  数据显示的逻辑处理。

先看xml的布局:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="60dp"
  5. android:background="#1344ff"
  6. android:gravity="center_vertical" >
  7. <FrameLayout
  8. android:layout_width="match_parent"
  9. android:layout_height="match_parent"
  10. android:layout_toRightOf="@+id/iv_1"
  11. >
  12. <RelativeLayout
  13. android:id="@+id/rela_move"
  14. android:layout_width="match_parent"
  15. android:layout_height="match_parent"
  16. >
  17. <TextView
  18. android:id="@+id/tv_1_1"
  19. android:layout_width="wrap_content"
  20. android:layout_height="wrap_content"
  21. android:background="@drawable/background"
  22. android:paddingBottom="4dp"
  23. android:paddingLeft="12dp"
  24. android:paddingRight="12dp"
  25. android:paddingTop="4dp"
  26. android:text="热议" />
  27. <TextView
  28. android:id="@+id/tv_1_2"
  29. android:layout_width="wrap_content"
  30. android:layout_height="wrap_content"
  31. android:layout_toRightOf="@+id/tv_1_1"
  32. android:paddingBottom="4dp"
  33. android:paddingLeft="12dp"
  34. android:paddingRight="12dp"
  35. android:paddingTop="4dp"
  36. android:text="疤痕的假发片接文件夹我看挺好" />
  37. <TextView
  38. android:id="@+id/tv_2_1"
  39. android:layout_below="@+id/tv_1_1"
  40. android:layout_width="wrap_content"
  41. android:layout_height="wrap_content"
  42. android:background="@drawable/background"
  43. android:paddingBottom="4dp"
  44. android:paddingLeft="12dp"
  45. android:paddingRight="12dp"
  46. android:paddingTop="4dp"
  47. android:text="热议" />
  48. <TextView
  49. android:id="@+id/tv_2_2"
  50. android:layout_width="wrap_content"
  51. android:layout_height="wrap_content"
  52. android:layout_below="@+id/tv_1_2"
  53. android:layout_toRightOf="@+id/tv_2_1"
  54. android:paddingBottom="4dp"
  55. android:paddingLeft="12dp"
  56. android:paddingRight="12dp"
  57. android:paddingTop="4dp"
  58. android:text="疤痕的假发片接文件夹我看挺好" />
  59. </RelativeLayout>
  60. <RelativeLayout
  61. android:id="@+id/rela_move2"
  62. android:layout_width="match_parent"
  63. android:layout_height="match_parent"
  64. android:visibility="invisible"
  65. >
  66. <TextView
  67. android:id="@+id/tv2_1_1"
  68. android:layout_width="wrap_content"
  69. android:layout_height="wrap_content"
  70. android:background="@drawable/background"
  71. android:paddingBottom="4dp"
  72. android:paddingLeft="12dp"
  73. android:paddingRight="12dp"
  74. android:paddingTop="4dp"
  75. android:text="热议222" />
  76. <TextView
  77. android:id="@+id/tv2_1_2"
  78. android:layout_width="wrap_content"
  79. android:layout_height="wrap_content"
  80. android:layout_toRightOf="@+id/tv2_1_1"
  81. android:paddingBottom="4dp"
  82. android:paddingLeft="12dp"
  83. android:paddingRight="12dp"
  84. android:paddingTop="4dp"
  85. android:text="疤痕的假发片接文件夹我看挺好" />
  86. <TextView
  87. android:id="@+id/tv2_2_1"
  88. android:layout_below="@+id/tv2_1_1"
  89. android:layout_width="wrap_content"
  90. android:layout_height="wrap_content"
  91. android:background="@drawable/background"
  92. android:paddingBottom="4dp"
  93. android:paddingLeft="12dp"
  94. android:paddingRight="12dp"
  95. android:paddingTop="4dp"
  96. android:text="热议222" />
  97. <TextView
  98. android:id="@+id/tv2_2_2"
  99. android:layout_width="wrap_content"
  100. android:layout_height="wrap_content"
  101. android:layout_below="@+id/tv2_1_2"
  102. android:layout_toRightOf="@+id/tv2_2_1"
  103. android:paddingBottom="4dp"
  104. android:paddingLeft="12dp"
  105. android:paddingRight="12dp"
  106. android:paddingTop="4dp"
  107. android:text="疤痕的假发片接文件夹我看挺好" />
  108. </RelativeLayout>
  109. </FrameLayout>
  110. <ImageView
  111. android:id="@+id/iv_1"
  112. android:layout_width="wrap_content"
  113. android:layout_height="wrap_content"
  114. android:layout_alignParentLeft="true"
  115. android:layout_centerVertical="true"
  116. android:src="@drawable/ic_launcher" />
  117. </RelativeLayout>
    布局没有什么好说的,就是一个Framelayout包含两个相对的布局,一个可见,一个不可见。

    UI大家可以自己定制。

    下面看代码:

  1. package com.demo.xsl.text;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import android.app.Activity;
  5. import android.os.Bundle;
  6. import android.os.Handler;
  7. import android.view.View;
  8. import android.view.animation.Animation;
  9. import android.view.animation.Animation.AnimationListener;
  10. import android.view.animation.TranslateAnimation;
  11. import android.widget.RelativeLayout;
  12. import android.widget.TextView;
  13. public class VerticalScrollTextActivity extends Activity {
  14. VerticalScrollTextView mSampleView;
  15. VerticalScrollTextView mSampleView2;
  16. private Handler handler;
  17. private int count = 1;
  18. List<String> tittleList = new ArrayList<String>();
  19. List<String> contentList = new ArrayList<String>();
  20. @Override
  21. public void onCreate(Bundle savedInstanceState) {
  22. super.onCreate(savedInstanceState);
  23. setContentView(R.layout.main);
  24. //世纪情况的数据模拟 数据可能为单数 也可能为双数
  25. tittleList.add("热议");
  26. tittleList.add("女人");
  27. tittleList.add("手机");
  28. // tittleList.add("哇哈哈");
  29. // tittleList.add("苹果");
  30. // tittleList.add("橘子");
  31. contentList.add("热议 鸡年大吉");
  32. contentList.add("女人 鸡年大吉");
  33. contentList.add("手机 鸡年大吉");
  34. // contentList.add("哇哈哈 还是比较好喝的");
  35. // contentList.add("苹果很甜知道不知道");
  36. // contentList.add("橘子哈是有点酸");
  37. handler = new Handler();
  38. //两套布局
  39. final RelativeLayout rela_move = (RelativeLayout) findViewById(R.id.rela_move);
  40. final RelativeLayout rela_move2 = (RelativeLayout) findViewById(R.id.rela_move2);
  41. final TextView tv_1_1 = (TextView) findViewById(R.id.tv_1_1);
  42. final TextView tv_1_2 = (TextView) findViewById(R.id.tv_1_2);
  43. final TextView tv_2_1 = (TextView) findViewById(R.id.tv_2_1);
  44. final TextView tv_2_2 = (TextView) findViewById(R.id.tv_2_2);
  45. final TextView tv2_1_1 = (TextView) findViewById(R.id.tv2_1_1);
  46. final TextView tv2_1_2 = (TextView) findViewById(R.id.tv2_1_2);
  47. final TextView tv2_2_1 = (TextView) findViewById(R.id.tv2_2_1);
  48. final TextView tv2_2_2 = (TextView) findViewById(R.id.tv2_2_2);
  49. //数据源的初始化的设置
  50. tv_1_1.setText(tittleList.get(0));
  51. tv_1_2.setText(contentList.get(0));
  52. tv_2_1.setText(tittleList.get(1));
  53. tv_2_2.setText(contentList.get(1));
  54. //进入动画 具体的平移高度大家自己可设置 我只是为了方便 随意设置的值
  55. final Animation translateAnimation2 = new TranslateAnimation(1.0f, 1.0f, 240.0f, 1.0f);
  56. translateAnimation2.setDuration(600);
  57. // 出去动画 具体的平移高度大家自己可设置 我只是为了方便 随意设置的值
  58. final Animation translateAnimation = new TranslateAnimation(1.0f, 1.0f, 1.0f, -200.0f);
  59. // 设置动画时间
  60. translateAnimation.setDuration(600);
  61. rela_move.startAnimation(translateAnimation);
  62. translateAnimation.setAnimationListener(new AnimationListener() {
  63. @Override
  64. public void onAnimationStart(Animation animation) {
  65. count++;
  66. if (tittleList.size() % 2 == 0) { //数据源为双数的情况
  67. int number = (2 * count) % tittleList.size();
  68. //主要是布局二的值改变 让布局一更随布局二的值改变
  69. if (number == 0) {
  70. tv2_1_1.setText(tittleList.get(tittleList.size() - 2));
  71. tv2_1_2.setText(contentList.get(tittleList.size() - 2));
  72. tv2_2_1.setText(tittleList.get(tittleList.size() - 1));
  73. tv2_2_2.setText(contentList.get(tittleList.size() - 1));
  74. } else {
  75. tv2_1_1.setText(tittleList.get(number - 2));
  76. tv2_1_2.setText(contentList.get(number - 2));
  77. tv2_2_1.setText(tittleList.get(number - 1));
  78. tv2_2_2.setText(contentList.get(number - 1));
  79. }
  80. }else { //数据源为单数的情况
  81. int number = (2 * count) % tittleList.size();
  82. if (number == 0) {
  83. tv2_1_1.setText(tittleList.get(tittleList.size() - 2));
  84. tv2_1_2.setText(contentList.get(tittleList.size() - 2));
  85. tv2_2_1.setText(tittleList.get(tittleList.size() - 1));
  86. tv2_2_2.setText(contentList.get(tittleList.size() - 1));
  87. }else if (number == 1) {
  88. tv2_1_1.setText(tittleList.get(tittleList.size() - 1));
  89. tv2_1_2.setText(contentList.get(tittleList.size() - 1));
  90. tv2_2_1.setText(tittleList.get(0));
  91. tv2_2_2.setText(contentList.get(0));
  92. } else {
  93. tv2_1_1.setText(tittleList.get(number - 2));
  94. tv2_1_2.setText(contentList.get(number - 2));
  95. tv2_2_1.setText(tittleList.get(number - 1));
  96. tv2_2_2.setText(contentList.get(number - 1));
  97. }
  98. }
  99. //布局一的出去动画一致性就执行布局二的进入动画
  100. rela_move2.startAnimation(translateAnimation2);
  101. }
  102. @Override
  103. public void onAnimationRepeat(Animation animation) {
  104. }
  105. @Override
  106. public void onAnimationEnd(Animation animation) {
  107. //布局二的动画结束后让布局一不可见
  108. rela_move.setVisibility(View.INVISIBLE);
  109. }
  110. });
  111. translateAnimation2.setAnimationListener(new AnimationListener() {
  112. @Override
  113. public void onAnimationStart(Animation animation) {
  114. rela_move2.setVisibility(View.VISIBLE);
  115. }
  116. @Override
  117. public void onAnimationRepeat(Animation animation) {
  118. }
  119. @Override
  120. public void onAnimationEnd(Animation animation) {
  121. handler.postDelayed(new Runnable() {
  122. @Override
  123. public void run() {
  124. //停留1.5s后 布局二的值全部赋值给布局一
  125. tv_1_1.setText(tv2_1_1.getText());
  126. tv_1_2.setText(tv2_1_2.getText());
  127. tv_2_1.setText(tv2_2_1.getText());
  128. tv_2_2.setText(tv2_2_2.getText());
  129. rela_move.setVisibility(View.VISIBLE);
  130. rela_move2.setVisibility(View.INVISIBLE);
  131. rela_move.startAnimation(translateAnimation);
  132. }
  133. }, 1500);
  134. }
  135. });
  136. }
  137. }




    代码注释的很清楚,其中最重要的就是其中的逻辑关系,需要静静地理清楚。

   第一次写博客,仅自勉。

  不喜勿喷。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/编程先知/article/detail/60767
推荐阅读
相关标签
  

闽ICP备14008679号