自定义列表数据自动循环向下滚动view(类似于通知通报消息)
首先申明,这个自定义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(类似于通知通报消息)的更多相关文章
- 只用css实现“每列四行,加载完一列后数据自动填充到下一列”的效果
只用css实现“每列四行,加载完一列后数据自动填充到下一列”的效果.这个题目用图表示如下: 如果将题目换成“只用css实现每行四列,加载完一行后数据自动填充到下一行”,那这个问题就简单多了,相信大家都 ...
- dataframe添加元素指定为列表,不同for循环命名空间下的变量重复问题
split=pd.DataFrame({'data':[0],'len':0,'count':0},index=[0])for i_t in range(over_128.shape[0]): ct= ...
- 向上滚动或者向下滚动分页异步加载数据(Ajax + lazyload)[上拉加载组件]
/**** desc : 分页异步获取列表数据,页面向上滚动时候加载前面页码,向下滚动时加载后面页码 ajaxdata_url ajax异步的URL 如data.php page_val_name a ...
- 使用keepAlive对上下拉刷新列表数据 和 滚动位置细节处理 - vue
[前言] 使用vue处理项目中遇到列表页面时,之前项目中总会有一些细节问题处理得不太好,这里总结一下,以便优化以后的代码.如下: 1. 使用mint-ui中的LoadMore组件上下拉刷新时,有时无法 ...
- 移动端UL列表无法平滑向下滚动问题
问题说明: 移动端向上滑动后,,列表无法自动滚动到底部~~而是类似屏幕"沾手"的效果(手离开屏幕直接停止在当前~列表不会自动向下滚动一段) 问题原因: 页面中存在如下代码: 当前页 ...
- vue-使用keepAlive对上下拉刷新列表数据 和 滚动位置细节进行处理
[前言] 使用vue处理项目中遇到列表页面时,有一些细节需要注意,这里总结一下,以便优化以后的代码.如下: 1. 使用mint-ui中的LoadMore组件上下拉刷新时,有时无法触发上拉加载更多的方法 ...
- UIScrollView实现自动循环滚动广告
实现效果如下: 功能说明: 程序运行,图片自动循环播放,采用定时器实现; 当用户用手势触摸滑动时,定时器的自动播放取消,停止触摸时,自动无限播放; 代码如下 : 采用封装视图,外部进行调用即可: 1. ...
- jQuery带控制按钮向上和向下滚动文本列表
效果:http://hovertree.com/texiao/jquery/64/ 效果图如下: 代码如下: <!DOCTYPE html> <html> <head&g ...
- android 自定义scrollview 仿QQ空间效果 下拉伸缩顶部图片,上拉回弹 上拉滚动顶部title 颜色渐变
首先要知道 自定义scrollview 仿QQ效果 下拉伸缩放大顶部图片 的原理是监听ontouch事件,在MotionEvent.ACTION_MOVE事件时候,使用不同倍数的系数,重置布局位置[ ...
随机推荐
- Ubuntu16.04 -- 后台进程Nohup
nohup用于使程序在用户退出登陆.关闭终端之后仍能继续运行 用法: nohup your_command & #(符号&使程序在后台运行) exit #(退出nohup模式) 启动后 ...
- JAVA常见算法题(五)
package com.xiaowu.demo; /** * 利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示. * * * @ ...
- IO流知识点
如何判断是输入还是输出?答:以程序为中心.如何判断是解码还是编码?答:以程序为中心.程序只懂二进制,所以,以二进制转换成字符是解码,字符转换成二进制是编码.1. 首先,File 它是给程序跟文件或文件 ...
- 搜索引擎Solr-6.6.0搭建
一.简介 Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口.用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引:也可以通过Http ...
- 15个最受欢迎的Python开源框架(转载)
一.Django: Python Web应用开发框架 Django是一个开放源代码的Web应用框架,由Python写成.采用了MVC的软件设计模式,即模型M,视图V和控制器C.它最初是被开发来用于管理 ...
- 基于Storyboard的创建多分支NavigationController的方法
如果遇到本文图片只展示一半的情况,多数情况下刷新一下浏览器即可 遇到的问题 我在写程序的时候碰到这样一个简单的需求,用户点击"我的XX"这样的功能时候,需要判断当前用户是否已经登录 ...
- 解决ListView在界面只显示一个item
ListView只显示一条都是scrollview嵌套listView造成的,将listView的高度设置为固定高度之后,三个条目虽然都完全显示.但是这个地方是动态显示的,不能写死.故采用遍历各个子条 ...
- XP如何在桌面新建宽带连接的快捷方式
1 打开控制面板,点击网络和Internet连接 2 如果存在宽带连接选项. 则点击左侧的网上邻居,然后点击查看网络连接 右击宽带连接,点击创建快捷方式,放到桌面,改一下快捷方式的名字即可. 3 ...
- const 使用方法具体解释
const使用方法具体解释 面向对象是C++的重要特性. 可是c++在c的基础上新添加的几点优化也是非常耀眼的 就const直接能够代替c中的#define 下面几点非常重要,学不好后果也也非常严重 ...
- Laravel之命令
一.创建命令 php artisan make:console SendEmails 上述命令将会生成一个类app/Console/Commands/SendEmails.php,当创建命令时,--c ...