Android自定义SurfaceView实现画板功能

作者:qq_25193681 时间:2022-01-17 06:57:19 

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

Android自定义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,画板
0
投稿

猜你喜欢

  • 一文带你搞懂Java中方法重写与方法重载的区别

    2022-05-14 03:19:13
  • Java编程实现生成给定范围内不重复随机数的方法小结

    2022-03-21 22:45:13
  • Java容器HashMap与HashTable详解

    2022-03-05 19:25:00
  • Android绘图常用方法汇总

    2023-11-19 20:06:43
  • java中抽象类和接口的相同和不同点介绍

    2021-05-30 04:53:31
  • Android中使用TextView实现文字跑马灯效果

    2023-07-28 11:07:33
  • 一步步实现Viewpager卡片翻页效果

    2022-10-15 02:14:25
  • 全网最深分析SpringBoot MVC自动配置失效的原因

    2021-07-20 03:53:25
  • C#拼接SQL语句 用ROW_NUMBER实现的高效分页排序

    2023-12-27 04:47:01
  • Java框架设计灵魂之反射的示例详解

    2023-06-13 21:34:34
  • 如何使用Dapper处理多个结果集与多重映射实例教程

    2022-07-06 11:38:43
  • Java十分钟精通异常处理机制

    2022-08-04 19:03:07
  • WPF设置窗体可以使用鼠标拖动大小的方法

    2023-05-11 12:38:50
  • MyBatis动态SQL特性详解

    2022-10-03 03:21:50
  • Android自定义ViewGroup之WaterfallLayout(二)

    2022-10-11 01:58:02
  • Springboot 内部服务调用方式

    2023-08-24 00:32:20
  • IDEA使用Gradle构建SpringBoot项目工程的详细教程

    2022-08-31 16:28:26
  • SpringBoot微信扫码支付的实现示例

    2023-02-08 03:03:44
  • .NET中的async和await关键字使用及Task异步调用实例

    2021-09-06 03:37:41
  • Spring Boot如何使用Spring Security进行安全控制

    2022-03-26 03:59:41
  • asp之家 软件编程 m.aspxhome.com