首先申明,这个自定义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. 新人补钙系列教程之:Molehill底层API中最重要的Context3D

    Context3D,是一个三维空间的处理环境,负责创建并处理三维对象的各个要素如顶点.片段.透视等等,并将处理的结果使用AGAL(Adobe图形汇编语言)上传给显卡进行运算,运算结果最终被回传给CPU ...

  2. 使用websocket进行消息推送服务

    Websocket主要做消息推送,简单,轻巧,比comet好用 入门了解:https://www.cnblogs.com/xdp-gacl/p/5193279.html /** * A Web Soc ...

  3. css 文字超出省略号

    white-space:nowrap; overflow:hidden; -o-text-overflow:ellipsis; text-overflow:ellipsis; 语法: text-ove ...

  4. JavaScript Best Practices

    原文: https://www.w3schools.com/js/js_best_practices.asp --------------------------------------------- ...

  5. Linq 数据排序,分页

    在用Linq查询中,常常需要用到分页功能,因为每次都需要些分页这些功能,于是把分页功能提取出来,不喜大家勿喷,只是贴出来,自觉地很实用.一下贴出核心代码: /// <summary> // ...

  6. 为windows开启winrm service, 以便进行远程管理

    为windows开启winrm service, 以便进行远程管理   是windows 一种方便远程管理的服务:开启winrm service,便于在日常工作中,远程管理服务器,或通过脚本,同时管理 ...

  7. hibernate学习系列-----(3)Session 缓存和持久化生命周期以及Session 基本操作

    Session缓存原理 为了能够在控制台更好的看到我们的hibernate干了些什么,可以在hibernate.cfg.xml文件中写入如下配置: <!-- print all generate ...

  8. Activity启动活动最佳写法

    一,在被启动的Activity中新加一个静态方法public static void actionStart(Context context, String data1, String data2) ...

  9. 类的成员函数指针和mem_fun适配器的用法

    先来看一个最简单的函数: void foo(int a) { cout << a << endl; } 它的函数指针类型为 void (*)(int); 我们可以这样使用: v ...

  10. POJ2536 Gopher II【二分图最大匹配】

    题目链接: http://poj.org/problem? id=2536 题目大意: 有N仅仅鼹鼠和M个洞穴,假设鼹鼠在S秒内不可以跑到洞穴,就会被老鹰捉住吃掉. 鼹鼠跑的速度为V米/秒. 已知一个 ...