搬砖过程中,猛然发现,这个效果图不是textview ,老板说他应该横向滚动,emmmm?
那么,我们来分析下需求:
这个自定义的textview 只占1行,可以循环滚动。文字只需要设置一次。当fragment 或者activity 被销毁的时候,线程也要销毁。
ok.由于canvas 中 获取到文本的宽度是不换行的。所以呢,我们开线程 修改x的位置就好了。
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
height = getHeight();
canvas.drawText(text,x,height/2+dp5,paint);
}
额,感觉没有什么好说的。直接贴代码吧。
```
/**
-
公告滚动控件
*/
public class TipText extends View {
String text="暂无数据";
private Context context;
private Paint paint;
private int textWidth;
private int textHeight;
private int width;
private int height;
private int x=400;
boolean opentrue=true;
private int dp5;public void setText(String text) {
this.text = text;
textWidth = CanvasUtils.calcTextWidth(paint, text);
textHeight = CanvasUtils.calcTextHeight(paint, text);
new Thread(new Runnable() {
@Override
public void run() {
while (opentrue){
try {
x=x-10;
if (Math.abs(x)>=(textWidth+width/2)){
x=400;
}
postInvalidate();
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}public TipText(Context context) {
super(context);
context = this.getContext();
paint = new Paint();
paint.setTextSize(Tools.dp2px(context,14));
dp5 = Tools.dp2px(context, 5);
paint.setColor(Color.parseColor("#ffffff"));}
public TipText(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
context = this.getContext();
paint = new Paint();
paint.setTextSize(Tools.dp2px(context,14));
paint.setColor(Color.parseColor("#ffffff"));
dp5 = Tools.dp2px(context, 5);}
public TipText(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
context = this.getContext();
paint = new Paint();
paint.setTextSize(Tools.dp2px(context,14));
paint.setColor(Color.parseColor("#ffffff"));
dp5 = Tools.dp2px(context, 5);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
height = getHeight();
canvas.drawText(text,x,height/2+dp5,paint);
}public void setOpentrue(boolean opentrue) {
this.opentrue = opentrue;
}
}
上面用到的工具类:
/**
* 画布常用工具类
*/
public class CanvasUtils {
private static Rect mCalcTextHeightRect = new Rect();
/**
* 通过画布预设获取当前文本的宽度
* @param paint
* @param demoText
* @return
*/
public static int calcTextWidth(Paint paint, String demoText) {
return (int) paint.measureText(demoText);
}
/**
* 通过 画布预设 获取当前文本的高度
* @param paint
* @param demoText
* @return
*/
public static int calcTextHeight(Paint paint, String demoText) {
Rect r = mCalcTextHeightRect;
r.set(0,0,0,0);
paint.getTextBounds(demoText, 0, demoText.length(), r);
return r.height();
}
}
tools.dp2x();就是字面意思,将dp 值转为2x的 px 值。
网友评论