当前位置: 移动技术网 > IT编程>移动开发>Android > android实现滚动文本效果

android实现滚动文本效果

2020年06月23日  | 移动技术网IT编程  | 我要评论

本文实例为大家分享了android实现滚动文本效果的具体代码,供大家参考,具体内容如下

效果图

实现方法

直接上代码

首先是一个自定义layout,继承自framelayout

public class animationtextlayout extends framelayout {
 private static final string tag = "animationtextlayout";
 private list<string> tiplist;
 private list<integer> displaylist;
 private list<textview> viewlist;
 private list<virtualpos> virtualposlist;
 private double deviantangle = 0;

 public animationtextlayout(@nonnull context context) {
  super(context);
  initview();
 }

 public animationtextlayout(@nonnull context context, @nullable attributeset attrs) {
  super(context, attrs);
  initview();
 }

 public animationtextlayout(@nonnull context context, @nullable attributeset attrs, int defstyleattr) {
  super(context, attrs, defstyleattr);
  initview();
 }

 private void initview() {
  viewlist = new arraylist<>();
  displaylist = new arraylist<>();
  virtualposlist = new arraylist<>();
 }

 /**
  * 设置需要显示的数据
  *
  * @param data   需要显示的数据
  */
 public void setdata(list<string> data) {
  this.tiplist = data;
  inittips();
 }


 private void inittips() {
  while (tiplist.size() > viewlist.size()) {
   addtipsview();
  }
  refreshtips();
  initvirpos();

  post(new runnable() {
   @override
   public void run() {
    initposition();
    requestlayout();
   }
  });

 }

 /**
  * 计算虚拟位置
  */
 private void initvirpos() {
  virtualposlist.clear();
  for (int i = 0; i < viewlist.size(); i++) {
   double angle = (math.pi * ((double) i / viewlist.size())*2)+(deviantangle*math.pi*2);
   if (angle>math.pi*2){
    angle-=math.pi*2;
   }
   virtualpos virtualpos = new virtualpos();
   virtualpos.text = tiplist.get(i);
   virtualpos.z = 100 * math.sin(angle);
   virtualpos.y = 100 * math.cos(angle);
   virtualposlist.add(virtualpos);
  }
 }

 /**
  * 将虚拟位置转化为实际高度和位置
  */
 private void initposition() {
  for (int i = 0; i < viewlist.size(); i++) {
   textview textview = viewlist.get(i);
   virtualpos virtualpos=virtualposlist.get(i);
   int realy = (int) ((100 - virtualpos.y)/200 *getmeasuredheight());
   framelayout.layoutparams layoutparams = (layoutparams) textview.getlayoutparams();
   layoutparams.topmargin = realy;
   if (virtualpos.z>=0){
    float textsize= (float) (( virtualpos.z)/100)*20+5;
    textview.settextsize(textsize);
    textview.setvisibility(visible);
   }else {
    textview.setvisibility(gone);
   }

   log.d(tag, "initposition: y=="+realy);
  }

 }

 private void refreshtips() {
  for (int i = 0; i < viewlist.size(); i++) {
   textview tip = viewlist.get(i);
   if (i < tiplist.size()) {
    tip.setvisibility(visible);
    tip.settext(tiplist.get(i));
    continue;
   }
   tip.setvisibility(gone);
  }
 }

 private textview addtipsview() {
  textview textview = new textview(getcontext());
  textview.settextsize(complex_unit_dip, 12);
  textview.settextcolor(color.parsecolor("#444444"));
  textview.setpadding(convertutil.dp2px(5), convertutil.dp2px(3), convertutil.dp2px(5), convertutil.dp2px(3));
  layoutparams layoutparams = new layoutparams(viewgroup.layoutparams.wrap_content, viewgroup.layoutparams.wrap_content);
  layoutparams.gravity=gravity.center_horizontal;
  layoutparams.rightmargin = convertutil.dp2px(6);
  addview(textview, layoutparams);
  viewlist.add(textview);
  return textview;
 }

 /**
  * 虚拟位置,最大x,y,z 最大值为100,最小值为-100
  */
 public static class virtualpos {
  public double x;
  public double y;
  public double z;
  public string text;
 }

 /**
  * 滚动的偏移值
  * @param deviantangle 最大为1
  */
 public void setdeviantangle(float deviantangle) {
  this.deviantangle = deviantangle;
  initvirpos();
  initposition();
 }

 public double getdeviantangle() {
  return deviantangle;
 }
}

调用方布局

<framelayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 tools:context=".animationtextactivity">
 <com.lanlengran.test.view.animationtextlayout
  android:id="@+id/anim_text_layout"
  android:layout_width="match_parent"
  android:background="@color/coloraccent"
  android:layout_height="400dp"/>
</framelayout>

调用方代码

public class animationtextactivity extends activity {
 private animationtextlayout manimtextlayout;

 @override
 protected void oncreate(bundle savedinstancestate) {
  super.oncreate(savedinstancestate);
  setcontentview(r.layout.activity_animation_text);
  manimtextlayout = findviewbyid(r.id.anim_text_layout);

  list<string> testdata = new arraylist<>();
  for (int i = 0; i < 30; i++) {
   testdata.add("测试数据" + i);
  }
  manimtextlayout.setdata(testdata);

  objectanimator animator = objectanimator.offloat(manimtextlayout, "deviantangle", 0f, 1f);
  animator.setduration(5000);
  animator.setrepeatcount(-1);
  animator.start();
 }
}

注意事项

此处的动画只是为了演示。可以根据需要改变自定view的改变滚动值的方法,就可以使滚轮滚动。例如将滚动的角度和手指拖动相结合啥的

 /**
  * 滚动的偏移值
  * @param deviantangle 最大为1
*/
public void setdeviantangle(float deviantangle)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网