斯诺克世锦赛赛程,wwe2009,丰台科技园
主要思想:
将一个view设计成多层:背景层,含中奖信息等;
遮盖层,用于刮奖,使用关联一个bitmap的canvas
在该bitmap上,使用它的canvas.drawpath的api来处理 手势滑动(类似刮奖的动作)
使用paint.setxfermode 来进行消除手势滑动区域
public class guaview extends view { private bitmap mbitmap; //遮盖的图层 private canvas mcanvas; //绘制遮盖图层 private paint mouterpaint; private path mpath; private float mlastx; private float mlasty; private bitmap mcoverbitmap; //遮盖图 private int mwidth, mheight; private paint minnerpaint; private string minfo; public guaview(context context) { this(context, null); } public guaview(context context, attributeset attrs) { super(context, attrs); init(); } private void init() { mpath = new path(); mouterpaint = new paint(); minnerpaint = new paint(); mcoverbitmap = bitmapfactory.decoderesource(getresources(), r.drawable.fg_guaguaka); minfo = "¥ 5 0 0"; } @override protected void onmeasure(int widthmeasurespec, int heightmeasurespec) { super.onmeasure(widthmeasurespec, heightmeasurespec); mwidth = mcoverbitmap.getwidth(); mheight = mcoverbitmap.getheight(); setmeasureddimension(mwidth, mheight); mbitmap = bitmap.createbitmap(mwidth, mheight, bitmap.config.argb_8888); mcanvas = new canvas(mbitmap); mcanvas.drawbitmap(mcoverbitmap, 0, 0, null); setouterpaint(); setinnerpaint(); } private void setinnerpaint() { minnerpaint.setcolor(color.red); minnerpaint.setstyle(paint.style.stroke); minnerpaint.setstrokecap(paint.cap.round); minnerpaint.setstrokejoin(paint.join.round); minnerpaint.setantialias(true); minnerpaint.setdither(true); //防抖 minnerpaint.setstrokewidth(5); minnerpaint.settextsize(100); minnerpaint.settextalign(paint.align.center); } private void setouterpaint() { mouterpaint.setcolor(color.green); mouterpaint.setstyle(paint.style.stroke); mouterpaint.setstrokecap(paint.cap.round); mouterpaint.setstrokejoin(paint.join.round); mouterpaint.setantialias(true); mouterpaint.setdither(true); //防抖 mouterpaint.setstrokewidth(20); } @override //path public boolean ontouchevent(motionevent event) { float x = event.getx(); float y = event.gety(); switch (event.getaction()) { case motionevent.action_down: mlastx = x; mlasty = y; mpath.moveto(x, y); break; case motionevent.action_move: float deltax = math.abs(x - mlastx); float deltay = math.abs(y - mlasty); if (deltax > 5 || deltay > 5) { mpath.lineto(x, y); } mlastx = x; mlasty = y; break; case motionevent.action_up: break; } invalidate();//调用ondraw return true; } @override protected void ondraw(canvas canvas) { super.ondraw(canvas); canvas.drawcolor(color.parsecolor("#bbbbbb")); //背景底色 灰色 canvas.drawtext(minfo, mwidth / 2, mheight / 4 * 3, minnerpaint); //绘制文本 canvas.drawbitmap(mbitmap, 0, 0, null); //绘制mbitmap 这是一个可变的bitmap,通过mcanvas绘制,首先绘制了mcoverbitmap drawpath(); } private void drawpath() { //使用该mode:dst和src相交后, 只保留dst,且除去相交的部份 mouterpaint.setxfermode(new porterduffxfermode(porterduff.mode.dst_out)); mcanvas.drawpath(mpath, mouterpaint); } }
paint.join 连续画笔衔接时:
paint.cap 指定对于 线和路径(lines and paths) 的开始和结束点的处理方式:
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
Android Manifest中meta-data扩展元素数据的配置与获取方式
Android实现获取meta-data和build.gradle的值
Android获取清单文件中的meta-data,解决碰到数值为null的问题
解决webview 第二次调用loadUrl页面不刷新的问题
解决Android WebView拦截url,视频播放加载失败的问题
Android webview加载https链接错误或无响应的解决
网友评论