Android SurfaceView画板操作
时间:2022-07-26
本文章向大家介绍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);
以上就是本文的全部内容,希望对大家的学习有所帮助。
- 实践 Mysql Group Replication 组复制
- Python爬虫入门(二)解析源码
- iOS加密算法总结
- 【Python爬虫实战】——爬取今日头条美女图片
- Python-贝叶斯实战垃圾邮件过滤(大量数据)
- C# 操作 access 数据库
- iOS学习——tableview中带编辑功能的cell键盘弹出遮挡和收起问题解决
- 搭建GitLab版本控制系统
- Mysql 8.0 更好的支持了 UUID
- 理解SQL原理SQL调优你必须知道的10条铁律
- 解决Vmware克隆出来虚拟机的网络问题
- Nginx|Tengine的编译安装步骤
- centos下tomcat安装调试
- Redis 实现接口访问频率限制
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释