接触了这么久的VIEw,总不能一直停留在VIEw里,现在开始呢,就要学习一个新的知识点:SurfaceVIEw,实际上SurfaceVIEw与VIEw的原理都差不多,只是效率和渲染方式上,SurfaceVIEw要优于VIEw,这也是我们写这个的原因。今天就看看这个SurfaceVIEw,好了,下面就是今天要说的效果。
界面很简单,就是一个按钮以及一个画板,先看看界面的代码吧
<linearLayout xmlns:androID="http://schemas.androID.com/apk/res/androID" xmlns:tools="http://schemas.androID.com/tools" androID:layout_wIDth="match_parent" androID:layout_height="match_parent" androID:orIEntation="vertical" tools:context="com.example.xinxindemo.MainActivity" > <com.example.xinxindemo.vIEw.SecondSurfaceVIEw androID:ID="@+ID/surfacevIEw" androID:layout_wIDth="match_parent" androID:layout_height="match_parent" androID:layout_weight="20" /> <linearLayout androID:layout_wIDth="match_parent" androID:layout_height="55dip" androID:orIEntation="horizontal" androID:padding="5dip" > <button androID:onClick="onClick" androID:layout_wIDth="wrap_content" androID:layout_height="match_parent" androID:text="clean" /></linearLayout></linearLayout>
对吧,界面不是很复杂,下面再看看这个SecondSurfaceVIEw是怎么实现的;
/** * 2016年7月26日17:20:13 * @author 小瓶盖 blog * */public class SecondSurfaceVIEw extends SurfaceVIEw implements SurfaceHolder.Callback,Runnable{ /** * 是否处于绘制状态 */ private boolean mIsDrawing; /** * 帮助类 */ private SurfaceHolder mHolder; /** * 画布 */ private Canvas mCanvas; /** * 路径 */ private Path mPath; /** * 画笔 */ private Paint mPaint; public SecondSurfaceVIEw(Context context,AttributeSet attrs,int defStyle) { super(context,attrs,defStyle); initVIEw(); } public SecondSurfaceVIEw(Context context,AttributeSet attrs) { super(context,attrs); initVIEw(); } public SecondSurfaceVIEw(Context context) { super(context); initVIEw(); } @OverrIDe public boolean ontouchEvent(MotionEvent event) { int x=(int) event.getX(); int y=(int) event.getY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: mPath.moveto(x,y); break; case MotionEvent.ACTION_MOVE: mPath.lineto(x,y); break; case MotionEvent.ACTION_UP: break; default: break; } return true; } private voID initVIEw() { mHolder=getHolder(); mHolder.addCallback(this); setFocusable(true); setFocusableIntouchMode(true); this.setKeepScreenOn(true); mPath=new Path(); mPaint=new Paint(); mPaint.setAntiAlias(true); mPaint.setcolor(color.BLACK); mPaint.setStyle(Style.stroke); mPaint.setstrokeWIDth(15); } @OverrIDe public voID run() { long start =System.currentTimeMillis(); while(mIsDrawing){ draw(); } long end =System.currentTimeMillis(); if (end-start<100) { try { Thread.sleep(100-(end-start)); } catch (Exception e) { e.printstacktrace(); } } } @OverrIDe public voID surfaceChanged(SurfaceHolder arg0,int arg1,int arg2,int arg3) { } @OverrIDe public voID surfaceCreated(SurfaceHolder arg0) { mIsDrawing=true; new Thread(this).start(); } @OverrIDe public voID surfaceDestroyed(SurfaceHolder arg0) { mIsDrawing=false; } private voID draw(){ try { mCanvas=mHolder.lockCanvas(); mCanvas.drawcolor(color.WHITE); mCanvas.drawPath(mPath,mPaint); } catch (Exception e) { e.printstacktrace(); }finally{ if (mCanvas!=null) { mHolder.unlockCanvasAndPost(mCanvas); } } } /** * 清除内容 */ public voID clean(){ initVIEw(); }}
然后就是MainActivity.java
/** * 2016年7月26日17:20:13 * @author 小瓶盖 blog * */public class MainActivity extends Activity{ SecondSurfaceVIEw surfaceVIEw; @OverrIDe protected voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVIEw(R.layout.activity_main); surfaceVIEw=(SecondSurfaceVIEw)findVIEwByID(R.ID.surfacevIEw); } public voID onClick(VIEw v){ surfaceVIEw.clean(); }}
源码下载:http://xiazai.jb51.net/201607/yuanma/SurfaceView(jb51.net).rar
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。
总结以上是内存溢出为你收集整理的Android自定义SurfaceView实现画板功能全部内容,希望文章能够帮你解决Android自定义SurfaceView实现画板功能所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)