
正文
自定义列表数据自动循环向下滚动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;
}
}







