自定义列表数据自动循环向下滚动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事件时候,使用不同倍数的系数,重置布局位置[ ...
随机推荐
- CSS3:transition过渡效果
之前的transform 可以实现转换,但是一下子就放大缩小视觉上不太好看,要想渐变该如何呢?可以使用transition transition主要包含四个属性值: transition: prope ...
- php设计模式之解释器模式
解释器设计模式用于分析一个实体的关键元素,并且针对每个元素都提供自己的解释或相应的动作. <?php /** * 解释器模式 */ class User { protected $_userna ...
- virtualenv 环境安装
# Python 2.7.6:wget http://python.org/ftp/python/2.7.6/Python-2.7.6.tar.xztar xf Python-2.7.6.tar. ...
- hdu 1283 最简单的计算机
水题. .. import java.util.Scanner; public class Main { static int m1, m2; static int r1, r2, r3; publi ...
- Myeclipse 编译等级
1.Java compiler level does not match the version of the installed Java project facet. 问题描述:编译等级不匹配 解 ...
- Linux如何查找大文件
https://www.cnblogs.com/kerrycode/p/4391859.html find . -type f -size +800M 如上命令所示,我们仅仅能看到超过800M大小的文 ...
- 修改oracle内存大小
在默认安装情况下,oracle的内存分配是按系统内存的大小比例分配的,内存比较大的情况下,oracle所占的内存也大,该情况下,我们一般要修改sga值来减少系统中oracle的内存过大问题. 用dba ...
- VM虚拟机 Windows虚拟机中linux鼠标不能动怎么办
有一次vmware安装red hat linux后,进入x-windows界面,鼠标不能用,百思不得其解,因为自己的安装linux的过程中设置绝对是没有问题的啊,鼠标设置肯定是usb带滑轮,这个肯定没 ...
- 关于web后门权限防删的一个新思路
见土司有一帖子 具体看下面连接 https://www.t00ls.net/thread-26444-1-2.html 这是php的 其实IIS也有类似的 这是MSF生成的一个ASPX执行shellc ...
- 显式启动Activity和隐式启动Activity
1.显式启动Intent intent = new Intent(this, class);startActivity(intent); 2.隐式启动AndroidManifest.xml中定义某个A ...