Android SurfaceView画板操作

 更新时间:2022年05月17日 11:21:00   作者:汪星没有熊  
这篇文章主要为大家详细介绍了Android SurfaceView画板操作,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了Android SurfaceView画板操作的具体代码,供大家参考,具体内容如下

画板——画路径

package com.example.review.view;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PorterDuff;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

/**
 * 画板画路径
 */
public class HuabanView extends SurfaceView implements SurfaceHolder.Callback {

 private SurfaceHolder surfaceHolder;
 private Path path = new Path();


 public HuabanView(Context context) {
  super(context);
 }

 public HuabanView(Context context, AttributeSet attrs) {
  super(context, attrs);
  surfaceHolder = getHolder();
  surfaceHolder.addCallback(this);//获得surfaceview的生命周期
 }

 public HuabanView(Context context, AttributeSet attrs, int defStyleAttr) {
  super(context, attrs, defStyleAttr);
 }

 public HuabanView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
  super(context, attrs, defStyleAttr, defStyleRes);
 }

 @Override
 public void surfaceCreated(SurfaceHolder holder) {
  new HuabanThread().start();
 }

 @Override
 public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

 }

 @Override
 public void surfaceDestroyed(SurfaceHolder holder) {

 }

 @Override
 public boolean onTouchEvent(MotionEvent event) {
  float x = event.getX();
  float y = event.getY();
  int action = event.getAction();
  if (action == MotionEvent.ACTION_DOWN) {//按下
   path.moveTo(x, y);
  } else if (action == MotionEvent.ACTION_MOVE) {//移动
   path.lineTo(x, y);
  }
  return true;
 }

 class HuabanThread extends Thread {
  @Override
  public void run() {
   super.run();
   //TODO:画笔
   Paint paint = new Paint();
   paint.setColor(Color.BLACK);
   paint.setStrokeWidth(20);
   paint.setStyle(Paint.Style.STROKE);
   paint.setAntiAlias(true);
   //TODO:画布
   while (true) {
    Canvas canvas = surfaceHolder.lockCanvas();
    //避免空指针
    if (canvas == null){
     return;
    }
    canvas.drawColor(Color.WHITE, PorterDuff.Mode.CLEAR);
    canvas.drawColor(Color.WHITE);
    canvas.drawPath(path,paint);
    surfaceHolder.unlockCanvasAndPost(canvas);
   }
  }
 }
 public void close(){
  path.reset();
 }
}

画板——画动态直线

package com.example.review.view;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PorterDuff;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

/**
 * 画板画路径
 * 画动态直线
 */
public class LineView extends SurfaceView implements SurfaceHolder.Callback {

 private SurfaceHolder surfaceHolder;
 private Path path = new Path();
 private int x = 0;

 public LineView(Context context) {
  super(context);
 }

 public LineView(Context context, AttributeSet attrs) {
  super(context, attrs);
  surfaceHolder = getHolder();
  surfaceHolder.addCallback(this);//获得surfaceview的生命周期
 }

 public LineView(Context context, AttributeSet attrs, int defStyleAttr) {
  super(context, attrs, defStyleAttr);
 }

 public LineView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
  super(context, attrs, defStyleAttr, defStyleRes);
 }

 @Override
 public void surfaceCreated(SurfaceHolder holder) {
  new HuabanThread().start();
 }

 @Override
 public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

 }

 @Override
 public void surfaceDestroyed(SurfaceHolder holder) {

 }

 class HuabanThread extends Thread {
  @Override
  public void run() {
   super.run();
   //TODO:画笔
   Paint paint = new Paint();
   paint.setColor(Color.BLACK);
   paint.setStrokeWidth(20);
   paint.setStyle(Paint.Style.STROKE);
   paint.setAntiAlias(true);
   //TODO:画布
   while (true) {
    Canvas canvas = surfaceHolder.lockCanvas();
    //避免空指针
    if (canvas == null){
     return;
    }
    canvas.drawColor(Color.WHITE, PorterDuff.Mode.CLEAR);
    canvas.drawColor(Color.WHITE);
    canvas.drawLine(0,100,x++,100,paint);
    surfaceHolder.unlockCanvasAndPost(canvas);
   }
  }
 }

 public void close(){
  path.reset();
 }

}

基本图形

//圆
canvas.drawOval(50,100,150,200,paint);
//半圆
canvas.drawArc(500,500,700,700,20,180,true,paint);
//矩形
canvas.drawRect(100,300,250,400,paint);
//三角形
canvas.drawLine(100,450,0,600,paint);
canvas.drawLine(0,600,400,600,paint);
canvas.drawLine(100,450,400,600,paint);
//梯形
canvas.drawLine(100,700,200,700,paint);
canvas.drawLine(100,700,0,900,paint);
canvas.drawLine(0,900,400,900,paint);
canvas.drawLine(200,700,400,900,paint);

//文字
canvas.drawText("截图",100,1000,paint);

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Android中使用ZXing生成二维码(支持添加Logo图案)

    Android中使用ZXing生成二维码(支持添加Logo图案)

    ZXing是谷歌的一个开源库,可以用来生成二维码、扫描二维码。接下来通过本文给大家介绍Android中使用ZXing生成二维码(支持添加Logo图案),需要的朋友参考下
    2017-01-01
  • Jetpack Compose 分步指南教程详解

    Jetpack Compose 分步指南教程详解

    这篇文章主要为大家介绍了Jetpack Compose 分步指南教程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • Android ListView仿微信聊天界面

    Android ListView仿微信聊天界面

    这篇文章主要为大家详细介绍了ListView仿微信聊天界面,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • Kotlin Service实现消息推送通知过程

    Kotlin Service实现消息推送通知过程

    这几天分析了一下的启动过程,于是乎,今天写一下Service使用; 给我的感觉是它并不复杂,千万不要被一坨一坨的代码吓住了,虽然弯弯绕绕不少,重载函数一个接着一个,就向走迷宫一样,但只要抓住主线阅读,很快就能找到出口
    2022-12-12
  • Android开发中实现应用的前后台切换效果

    Android开发中实现应用的前后台切换效果

    这篇文章主要介绍了Android开发中实现应用的前后台切换效果的方法,文章最后还附带了监听程序是否进入后台的判断方法,需要的朋友可以参考下
    2016-02-02
  • Android编程之退出整个应用程序的方法

    Android编程之退出整个应用程序的方法

    这篇文章主要介绍了Android编程之退出整个应用程序的方法,实例分析了Android直接关闭所有的Acitivity并退出应用程序的实现技巧,需要的朋友可以参考下
    2015-12-12
  • Android项目中使用Eclipse导出jar文件的操作方法

    Android项目中使用Eclipse导出jar文件的操作方法

    文章讲述了如何使用Eclipse将Android项目打包成jar文件,并详细解答了在打包过程中遇到的问题,如如何处理依赖的jar或library,以及如何解决在其他项目中引用时出现的NoClassDefFoundError错误
    2025-02-02
  • 详解Android OkHttp完全解析

    详解Android OkHttp完全解析

    本篇文章主要介绍了Android OkHttp完全解析,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-11-11
  • Android 数据库SQLite 写入SD卡的方法

    Android 数据库SQLite 写入SD卡的方法

    如果手机没有root,数据库文件是无法查看到的,不方便调试。最好的办法是把数据库写进SD卡。通过本文给大家介绍Android 数据库SQLite 写入SD卡的方法,需要的朋友参考下吧
    2016-04-04
  • Android自定义弹出框dialog效果

    Android自定义弹出框dialog效果

    这篇文章主要为大家详细介绍了Android自定义弹出框dialog效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06

最新评论