Android SurfaceView畫板操作
本文實(shí)例為大家分享了Android SurfaceView畫板操作的具體代碼,供大家參考,具體內(nèi)容如下
畫板——畫路徑
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) {//移動(dòng)
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();
}
}畫板——畫動(dòng)態(tài)直線
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;
/**
* 畫板畫路徑
* 畫動(dòng)態(tài)直線
*/
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);以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android實(shí)現(xiàn)畫板功能(二)
- Android實(shí)現(xiàn)畫板功能(一)
- Android實(shí)現(xiàn)簡(jiǎn)單畫圖畫板
- Android studio實(shí)現(xiàn)畫板功能
- Android實(shí)現(xiàn)畫畫板案例
- Android畫板開發(fā)之添加文本文字
- Android畫板開發(fā)之添加背景和保存畫板內(nèi)容為圖片
- Android畫板開發(fā)之撤銷反撤銷功能
- Android畫板開發(fā)之基本畫筆功能
- Android畫板開發(fā)之橡皮擦功能
- Android曲線更圓滑的簽名畫板
- Android實(shí)現(xiàn)繪畫板功能
相關(guān)文章
Android中使用ZXing生成二維碼(支持添加Logo圖案)
ZXing是谷歌的一個(gè)開源庫,可以用來生成二維碼、掃描二維碼。接下來通過本文給大家介紹Android中使用ZXing生成二維碼(支持添加Logo圖案),需要的朋友參考下2017-01-01
Kotlin Service實(shí)現(xiàn)消息推送通知過程
這幾天分析了一下的啟動(dòng)過程,于是乎,今天寫一下Service使用; 給我的感覺是它并不復(fù)雜,千萬不要被一坨一坨的代碼嚇住了,雖然彎彎繞繞不少,重載函數(shù)一個(gè)接著一個(gè),就向走迷宮一樣,但只要抓住主線閱讀,很快就能找到出口2022-12-12
Android開發(fā)中實(shí)現(xiàn)應(yīng)用的前后臺(tái)切換效果
這篇文章主要介紹了Android開發(fā)中實(shí)現(xiàn)應(yīng)用的前后臺(tái)切換效果的方法,文章最后還附帶了監(jiān)聽程序是否進(jìn)入后臺(tái)的判斷方法,需要的朋友可以參考下2016-02-02
Android編程之退出整個(gè)應(yīng)用程序的方法
這篇文章主要介紹了Android編程之退出整個(gè)應(yīng)用程序的方法,實(shí)例分析了Android直接關(guān)閉所有的Acitivity并退出應(yīng)用程序的實(shí)現(xiàn)技巧,需要的朋友可以參考下2015-12-12
Android項(xiàng)目中使用Eclipse導(dǎo)出jar文件的操作方法
文章講述了如何使用Eclipse將Android項(xiàng)目打包成jar文件,并詳細(xì)解答了在打包過程中遇到的問題,如如何處理依賴的jar或library,以及如何解決在其他項(xiàng)目中引用時(shí)出現(xiàn)的NoClassDefFoundError錯(cuò)誤2025-02-02
Android 數(shù)據(jù)庫SQLite 寫入SD卡的方法
如果手機(jī)沒有root,數(shù)據(jù)庫文件是無法查看到的,不方便調(diào)試。最好的辦法是把數(shù)據(jù)庫寫進(jìn)SD卡。通過本文給大家介紹Android 數(shù)據(jù)庫SQLite 寫入SD卡的方法,需要的朋友參考下吧2016-04-04

