Android自定义SurfaceView实现画板功能

概述接触了这么久的View,总不能一直停留在View里,现在开始呢,就要学习一个新的知识点:SurfaceView,实际上SurfaceView与View的原理都差不多,只是效率和渲染方式上,SurfaceView要优于View,这也是我们写这个的原因。

接触了这么久的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实现画板功能所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1148767.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存