首先申明,这个自定义View不是本人写的,大神写的,本人仅限学习一级研究使用

直接上代码吧!后面我再解释一遍

 package com.egojit.android.gcoa.views;

 import android.animation.Animator;
import android.animation.TypeEvaluator;
import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.WindowManager; import com.asuka.android.asukaandroid.comm.utils.LogUtil;
import com.asuka.android.asukaandroid.view.EmptyView;
import com.egojit.android.gcoa.model.EmptyModel; import java.util.List; /**
* Created by Administrator on 2017/4/18 0018.
*/ public class CustomScorllView extends View {
private Context mContext;
private boolean hasStart=false;
private List<EmptyModel> sroucesList;
private double strHeight;
private Point startPoint;
private Point endPoint;
private boolean stop; public void setSroucesList(List<EmptyModel> sroucesList) {
this.sroucesList = sroucesList;
type=getCurType();
title=getCurTitle();
invalidate();
} public CustomScorllView(Context context) {
super(context);
mContext=context;
} public CustomScorllView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
mContext=context;
} public CustomScorllView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
mContext=context;
} public CustomScorllView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
mContext=context;
} private void startScorll() {
int tempY=y;
Message message=new Message();
message.obj=tempY;
handler.sendMessage(message);
}
Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
int tempY= (int) msg.obj;
y=tempY; if (tempY>-50){
invalidate();
tempY=tempY-1;
Message message=new Message();
message.obj=tempY;
handler.sendMessage(message);
}
}
};
int start,end;
public void start(){
Point startPoint = new Point(start, 50);
Point endPoint = new Point(end, 50);
final ValueAnimator animator = ValueAnimator
.ofObject(new PointEvaluator(), startPoint, endPoint);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
Point mPoint = ((Point) animation.getAnimatedValue());
y=mPoint.x;
invalidate();
}
});
animator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) { } @Override
public void onAnimationEnd(Animator animation) {
//下一个显示 if ( start==baseline){
start= (int) (-strHeight/2);
end=baseline;
EmptyModel model=sroucesList.get(0);
sroucesList.remove(0);
sroucesList.add(model);
type=getCurType();
title=getCurTitle();
start();
}else {
start=baseline;
end= (int) (getMeasuredHeight()+strHeight/2);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
start();
}
},4000);
} } @Override
public void onAnimationCancel(Animator animation) { } @Override
public void onAnimationRepeat(Animator animation) { }
});
animator.setDuration(3000);
animator.start();
}
public void startAnimation() {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
hasStart=true;
type=getCurType();
title=getCurTitle();
start=baseline;
end= (int) (getMeasuredHeight()+strHeight/2);
startPoint = new Point(start, 50);
endPoint = new Point(end, 50);
start();
}
},4000);
} private String getCurTitle() {
return sroucesList.get(0).getVar1();
} private String getCurType() {
return sroucesList.get(0).getVar();
} private String getNextTitle() {
if (sroucesList.size()==1){
return sroucesList.get(0).getVar1();
}else {
return sroucesList.get(1).getVar1();
} } private String getNextType() {
if (sroucesList.size()==1){
return sroucesList.get(0).getVar();
}else {
return sroucesList.get(1).getVar();
}
} int baseline=-999;
int y;
String type="哈哈哈";
String title="个囊女女过过过过";
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas); Paint redPaint = new Paint();
redPaint.setAntiAlias(true);
redPaint.setTextSize(gettextSize(45));
redPaint.setColor(0xff50a3ef);
redPaint.setTextAlign(Paint.Align.LEFT); Paint blckPaint = new Paint();
blckPaint.setAntiAlias(true);
blckPaint.setTextSize(gettextSize(45));
blckPaint.setColor(Color.BLACK);
blckPaint.setTextAlign(Paint.Align.LEFT); Paint.FontMetricsInt fontMetrics = redPaint.getFontMetricsInt();
String typeStr="[" + type + "]";
//直接返回参数字符串所占用的宽度
float strWidth = redPaint.measureText(typeStr);
strHeight=getTxtHeight(redPaint)+15;
if (baseline==-999&&sroucesList!=null){
baseline = (getMeasuredHeight() - fontMetrics.bottom + fontMetrics.top) / 2 - fontMetrics.top;
y=baseline;
}
// LogUtil.e("-----------------handler---------"+y);
canvas.drawText(typeStr, 30 , y , redPaint);
canvas.drawText(title, strWidth+60 , y , blckPaint); }
public double getTxtHeight(Paint mPaint) {
Paint.FontMetrics fm = mPaint.getFontMetrics();
return Math.ceil(fm.descent - fm.ascent);
}
public class PointEvaluator implements TypeEvaluator<Point> {
@Override
public Point evaluate(float fraction, Point startValue, Point endValue) {
// LogUtil.e("-----------------fraction---------"+fraction);
int resultX = (int) (fraction * (endValue.x-startValue.x)+startValue.x);
int resultY = (int) (fraction * startValue.y);
return new Point(resultX, resultY);
}
} @Override
public void setOnClickListener(@Nullable OnClickListener l) {
super.setOnClickListener(l); } public List<EmptyModel> getSroucesList() {
return sroucesList;
} public float gettextSize(float f){ int screenWidth =getScreenWidth(mContext); float ratioWidth = (float)screenWidth / 1080; return Math.round(f * ratioWidth);
} /**
* 获取屏幕宽度
*
* @return
*/
@SuppressWarnings("deprecation")
public int getScreenWidth(Context context) {
return ((WindowManager) context
.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay()
.getWidth();
} }

主界面布局为

  <com.wangy.views.CustomScorllView
android:id="@+id/custom_scorllView"
android:layout_width="match_parent"
android:layout_height="match_parent"></com.wany.views.CustomScorllView>

那么如何使用呢!

使用起来就很简单了

  List<EmptyModel> alist=new ArrayList<>();
for (int i=0;i<newsList.size();i++){
JSONObject object=newsList.getJSONObject(i);
EmptyModel model=new EmptyModel();
String fileType=object.getString("fileType");
String title=object.getString("title");
String id=object.getString("id");
model.setVar(fileType);
model.setVar1(title);
model.setVar2(id);
alist.add(model);
}
if (alist.size()==0)return;
custom_scorllView.setSroucesList(alist);
custom_scorllView.startAnimation();

其中的newsList为列表数据,你可以从接口中取也可以put值,

EmptyModel为一个空model,他是用来直接设置接口参数形成一个model,这样使用起来比较方便

 package com.egojit.android.gcoa.model;

 /**
* Created by Administrator on 2016-06-14.
*/
public class EmptyModel extends Entity {
String var;
String var1;
String var2;
String var3;
String var4;
String var11;
String var12;
String var13;
String var14;
String var5;
String var15; public String getVar5() {
return var5;
} public void setVar5(String var5) {
this.var5 = var5;
} public String getVar15() {
return var15;
} public void setVar15(String var15) {
this.var15 = var15;
} public String getVar11() {
return var11;
} public void setVar11(String var11) {
this.var11 = var11;
} public String getVar12() {
return var12;
} public void setVar12(String var12) {
this.var12 = var12;
} public String getVar13() {
return var13;
} public void setVar13(String var13) {
this.var13 = var13;
} public String getVar14() {
return var14;
} public void setVar14(String var14) {
this.var14 = var14;
} public String getVar1() {
return var1;
} public void setVar1(String var1) {
this.var1 = var1;
} public String getVar2() {
return var2;
} public void setVar2(String var2) {
this.var2 = var2;
} public String getVar3() {
return var3;
} public void setVar3(String var3) {
this.var3 = var3;
} public String getVar4() {
return var4;
} public void setVar4(String var4) {
this.var4 = var4;
} public String getVar() {
return var;
} public void setVar(String var) {
this.var = var;
}
}

自定义列表数据自动循环向下滚动view(类似于通知通报消息)的更多相关文章

  1. 只用css实现“每列四行,加载完一列后数据自动填充到下一列”的效果

    只用css实现“每列四行,加载完一列后数据自动填充到下一列”的效果.这个题目用图表示如下: 如果将题目换成“只用css实现每行四列,加载完一行后数据自动填充到下一行”,那这个问题就简单多了,相信大家都 ...

  2. dataframe添加元素指定为列表,不同for循环命名空间下的变量重复问题

    split=pd.DataFrame({'data':[0],'len':0,'count':0},index=[0])for i_t in range(over_128.shape[0]): ct= ...

  3. 向上滚动或者向下滚动分页异步加载数据(Ajax + lazyload)[上拉加载组件]

    /**** desc : 分页异步获取列表数据,页面向上滚动时候加载前面页码,向下滚动时加载后面页码 ajaxdata_url ajax异步的URL 如data.php page_val_name a ...

  4. 使用keepAlive对上下拉刷新列表数据 和 滚动位置细节处理 - vue

    [前言] 使用vue处理项目中遇到列表页面时,之前项目中总会有一些细节问题处理得不太好,这里总结一下,以便优化以后的代码.如下: 1. 使用mint-ui中的LoadMore组件上下拉刷新时,有时无法 ...

  5. 移动端UL列表无法平滑向下滚动问题

    问题说明: 移动端向上滑动后,,列表无法自动滚动到底部~~而是类似屏幕"沾手"的效果(手离开屏幕直接停止在当前~列表不会自动向下滚动一段) 问题原因: 页面中存在如下代码: 当前页 ...

  6. vue-使用keepAlive对上下拉刷新列表数据 和 滚动位置细节进行处理

    [前言] 使用vue处理项目中遇到列表页面时,有一些细节需要注意,这里总结一下,以便优化以后的代码.如下: 1. 使用mint-ui中的LoadMore组件上下拉刷新时,有时无法触发上拉加载更多的方法 ...

  7. UIScrollView实现自动循环滚动广告

    实现效果如下: 功能说明: 程序运行,图片自动循环播放,采用定时器实现; 当用户用手势触摸滑动时,定时器的自动播放取消,停止触摸时,自动无限播放; 代码如下 : 采用封装视图,外部进行调用即可: 1. ...

  8. jQuery带控制按钮向上和向下滚动文本列表

    效果:http://hovertree.com/texiao/jquery/64/ 效果图如下: 代码如下: <!DOCTYPE html> <html> <head&g ...

  9. android 自定义scrollview 仿QQ空间效果 下拉伸缩顶部图片,上拉回弹 上拉滚动顶部title 颜色渐变

    首先要知道  自定义scrollview 仿QQ效果 下拉伸缩放大顶部图片 的原理是监听ontouch事件,在MotionEvent.ACTION_MOVE事件时候,使用不同倍数的系数,重置布局位置[ ...

随机推荐

  1. 脑科学对基金经理的八个启示 z

    脑科学对基金经理的八个启示 第一,总想要更多.人类大脑是在物资奇缺过程中进化的,所以获得任何“资源”,如食物.性.金钱等,都可以让人感觉良好,大脑也会鼓励我们继续下去. 事实上,可卡因等药物就是“绑架 ...

  2. VUE的进阶 标签属性数据绑定和拼接

    在vue官网把文档扫了一遍后,就开始写网站项目了,没有设计,就百度里找了一个h5的助赢软件的网站把他copy下来,想想有点坏了,接着把内容改改吧.首先开始做一个列表展示vue实例好后,给对象添加默认数 ...

  3. Android ToolBar 使用完全解析

    ToolBar简介 ToolBar是Android 5.0推出的一个新的导航控件用于取代之前的ActionBar,由于其高度的可定制性.灵活性.具有Material Design风格等优点,越来越多的 ...

  4. C# 下利用ICSharpCode.SharpZipLib.dll实现文件/目录压缩、解压缩

    ICSharpCode.SharpZipLib.dll下载地址 1.压缩某个指定文件夹下日志,将日志压缩到CompressionDirectory文件夹中,并清除原来未压缩日志. #region 压缩 ...

  5. SuperMap iClient如何使用WMTS地图服务(转)

    http://blog.sina.com.cn/s/blog_6259ebd50102v221.html 什么是WMTS服务 WMTS,切片地图Web服务(Web Map Tile Service)当 ...

  6. redhat6.4 install 163 source

    1) 到http://mirrors.163.com的 centos帮助文档 中下载CentOS6-Base-163.repo文件,存放到/etc/yum.repo.d中 wget http://mi ...

  7. Linux学习之二-Linux系统的目录结构

    Linux学习之二-Linux系统的目录结构 在Linux的根目录下,有很多的目录,但是需要记住,对于Linux而言,一切皆文件.因此此处的目录也是文件.用ls / 命令就能看到根目录下的各类不同的目 ...

  8. Java虚拟机内存分配和回收策略

    1 对象优先分配在Eden区 对象优先在Eden进行分配,大多数情况下,对象在新生代Eden区进行分配.当Eden区没有足够的空间进行分配时,虚拟机会发起一次Minor GC. 新生代GC(Ninor ...

  9. java int转String全部方式的效率对照与深入解析

    在java中,大家肯定都会遇到int类型转String类型的情形,知其然知其所以然.总结加分析一下,int类型转String类型有下面几种方式: a+"" String.value ...

  10. JMeter接口测试中文乱码问题总结

    在测试过程中遇到了请求json串中文乱码,所以查看了这篇文章,将字符集修改后,乱码问题已经处理. 转载http://blog.csdn.net/qing_java/article/details/69 ...