Android SurfaceView画板操作
作者:汪星没有熊 发布时间:2022-07-10 15:12:23
标签: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);
来源:https://blog.csdn.net/weixin_45697390/article/details/105804970
0
投稿
猜你喜欢
- 一、简介项目开发中存在系统之间互调问题,又不想用dubbo,这里提供几种springboot方案:1、使用Feign进行消费(推荐)2、使用
- 首先利用IDEA创建Maven工程项目1.选择新建项目2.选中Maven骨架3.填写项目名称和项目位置4.Finsh之后默认打开的是pom.
- 本文实例为大家分享了C++实现俄罗斯方块的具体代码,供大家参考,具体内容如下先是效果图:主菜单:游戏:设置:错误处理:代码:#include
- 在Spring Boot中,Spring Boot会自动搜索映射的Entity,并且创建相应的table,但是有时候我们希望自定义某些内容,
- 应朋友们反馈的Android基础薄弱的问题,决定出一套Android基础教程,帮助大家复习,巩固Android基础,今天要讲的是Androi
- spring boot框架中已经集成了redis,在1.x.x的版本时默认使用的jedis客户端,现在是2.x.x版本默认使用的lettuc
- 本文实例讲述了java实现切割wav音频文件的方法。分享给大家供大家参考,具体如下:import it.sauronsoftware.jav
- 工欲善其事,必先利其器很多程序员可能都忘了记录应用程序的行为是一件多么重要的事,当遇到多线程环境下高压力导致的并发bug时,你就能体会到记录
- Android开发中少不了真机调试,总用数据线 * 拔拔的还是不方便也不稳定,其实可以实现WIFI的方式连接android手机。 &
- 问题起因主要是使用mybatis作为ORM之后,返回的对象为Map,然后对于数据库的datetime,datestamp类型返回为时间戳而不
- 一、一对一关联 1.1、提出需求根据班级id查询班级信息(带老师的信息)1.2、创建表和数据创建一张教师表和班级表,这里我们假设一
- ZooKeeper 是一个典型的分布式数据一致性解决方案,分布式应用程序可以基于 ZooKeeper 实现诸如数据发布/订阅、负载均衡、分布
- 一Map特性:1 Map提供一种映射关系,其中的元素是以键值对(key-value)的形式存储的,能够实现根据key快速查找value;2
- ${} 和 #{} 都是 MyBatis 中用来替换参数的,它们都可以将用户传递过来的参数,替换到 MyBatis 最终生成的 SQL 中,
- 在使用struts多模块的,找到一些小技巧和经验,与大家分享一下。 关于多module的配置就不说了,只需要用不同的config
- 一、前言CountDownLatch维护了一个计数器(还是是state字段),调用countDown方法会将计数器减1,调用await方法会
- 本文实例为大家分享了C#仿Windows XP自带的扫雷游戏的具体代码,供大家参考,具体内容如下1 题目描述:模仿Windows XP自带的
- 背景在开发中,如果用try catch的方式,每个方法都需要单独实现,为了方便分类异常,返回给前端,采用了@ControllerAdvice
- 一、编译环境spring5.0.x源码gradle4.9jdk1.8_151IntelliJ IDEA 2020.1二、安装gradle1、
- java 判断两个对象是否为同一个对象用“==”比较的是引用的地址,用equals比较的就是值。那我们new两个相同的对象什么属性都一样,为