日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

安卓-橡皮擦擦线完整实现

發布時間:2024/3/12 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 安卓-橡皮擦擦线完整实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

安卓-橡皮擦擦線完整實現

小伙伴兒們來看看就好
因為公司的需要,我從網上找了很多demo,但是大多橡皮擦僅僅是將畫筆改成透明,那么如何才能擦線呢。
我也是第一次玩csdn博客,格式啥的不太了解,大家看看代碼就好,其實就是將每次畫的點都存入一個集合。
那么就直接放代碼了

“`
package com.cavasdemo;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.RectF;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.ImageView;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class MainActivity extends Activity implements View.OnClickListener {

private ImageView iv; private Button btn_canvas; private Button btn_eraser_line; private Button btn_clear;private Bitmap baseBitmap; private Canvas canvas; private int height; private int width;private List<DrawPath> savePath; private List<DrawPath> deletePath; private DrawPath drawpath;private Path mPath; private float preX, preY;// 之前的XY的位置,用于下面的手勢移動private Paint mBitmapPaint; private Paint mPaint; private RectF rf; private boolean openCanvas = false;@Override protected void onCreate(Bundle savedInstanceState) {requestWindowFeature(Window.FEATURE_NO_TITLE);super.onCreate(savedInstanceState);setContentView(R.layout.activity_canvas_view);initView();initCanvas();initListener();canvas.drawBitmap(baseBitmap, 0, 0, mBitmapPaint);canvas.drawPath(mPath, mPaint); }private void initView() {iv = (ImageView) findViewById(R.id.iv);btn_canvas = (Button) findViewById(R.id.btn_canvas);btn_eraser_line = (Button) findViewById(R.id.btn_eraser_line);//橡皮擦線btn_clear = (Button) findViewById(R.id.btn_clear);savePath = new ArrayList<>();deletePath = new ArrayList<DrawPath>(); }private void initListener() {btn_canvas.setOnClickListener(this);btn_eraser_line.setOnClickListener(this);btn_clear.setOnClickListener(this); }private void initCanvas() {//創建畫筆mPaint = new Paint();mPaint.setAntiAlias(true);//抗鋸齒mPaint.setDither(true);mPaint.setColor(0xFF00FF00);mPaint.setStyle(Paint.Style.STROKE);// 設置畫筆的填充方式為無填充mPaint.setStrokeJoin(Paint.Join.ROUND);mPaint.setStrokeCap(Paint.Cap.ROUND);mPaint.setStrokeWidth(10);mBitmapPaint = new Paint(Paint.DITHER_FLAG);// 獲取屏幕的高度與寬度width = getResources().getDisplayMetrics().widthPixels;height = getResources().getDisplayMetrics().heightPixels;baseBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);// 建立圖像緩沖區用來保存圖像//創建一個畫布canvas = new Canvas(baseBitmap);mPath = new Path();

// 顯示舊的畫布
canvas.drawBitmap(baseBitmap, 0, 0, mBitmapPaint);
iv.setImageBitmap(baseBitmap);
}

@Override public void onClick(View v) {switch (v.getId()) {case R.id.btn_canvas://繪圖if (openCanvas) {btn_canvas.setText("開啟畫圖");openCanvas = true;}else {btn_canvas.setTag("關閉畫圖");openCanvas = false;// 取兩層繪制交集。顯示上層mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OVER));mPaint.setAntiAlias(true);//畫筆顏色mPaint.setColor(Color.RED);//寬度色素mPaint.setStrokeWidth(5);iv.setImageBitmap(baseBitmap);canvas.drawBitmap(baseBitmap, 0, 0, mBitmapPaint);onTouch();}break;case R.id.btn_eraser_line:iv.setOnTouchListener(new View.OnTouchListener() {float mX;float mY;@Overridepublic boolean onTouch(View v, MotionEvent event) {float moveX = event.getX();float moveY = event.getY();switch (event.getAction()) {case MotionEvent.ACTION_DOWN:mX = moveX;mY = moveY;break;case MotionEvent.ACTION_MOVE:float dx = Math.abs(moveX - mX);float dy = Math.abs(moveY - mY);if (dx > 5 || dy > 5) {// 用戶要移動超過5像素才算是畫圖,免得手滑、手抖現象mX = moveX;mY = moveY;}//刪除滑動區域集合for (int i = 0; i < savePath.size(); i++) {RectF rectF = savePath.get(i).rectF;if (rectF.contains(mX, mY)) {savePath.remove(i);}}System.out.println(savePath.size());if (savePath != null && savePath.size() > 0) {initCanvas();Iterator<DrawPath> iter = savePath.iterator();while (iter.hasNext()) {DrawPath dp = iter.next();canvas.drawBitmap(baseBitmap, 0, 0, mBitmapPaint);canvas.drawPath(dp.path, dp.paint);iv.setImageBitmap(baseBitmap);}} else {initCanvas();canvas.drawBitmap(baseBitmap, 0, 0, mBitmapPaint);iv.setImageBitmap(baseBitmap);}iv.invalidate();break;case MotionEvent.ACTION_UP:break;}return true;}});break;case R.id.btn_clear://徹底清除畫布removeAllPaint();break;} }/*** 清空的主要思想就是初始化畫布* 將保存路徑兩個List清空*/ public void removeAllPaint() {//調用初始化畫布函數以清空畫布initCanvas();iv.invalidate();savePath.clear();deletePath.clear(); }private void touch_start(float x, float y) {mPath.reset();//清空pathmPath.moveTo(x, y);preX = x;preY = y; }private void touch_move(float x, float y) {float dx = Math.abs(x - preX);float dy = Math.abs(y - preY);if (dx > 5 || dy > 5) {//源碼mPath.quadTo(preX, preY, (x + preX) / 2, (y + preY) / 2);canvas.drawPath(mPath, mPaint);preX = x;preY = y;} }private void touch_up() {mPath.lineTo(preX, preY);mPath.computeBounds(rf, true);savePath.add(drawpath);mPath = null; }private void onTouch() {iv.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View view, MotionEvent event) {float x = event.getX();float y = event.getY();switch (event.getAction()) {case MotionEvent.ACTION_DOWN:mPath = new Path();rf = new RectF();drawpath = new DrawPath();drawpath.path = mPath;drawpath.paint = mPaint;drawpath.rectF = rf;touch_start(x, y);iv.invalidate();//刷新break;case MotionEvent.ACTION_MOVE:touch_move(x, y);iv.invalidate();break;case MotionEvent.ACTION_UP:touch_up();iv.invalidate();break;}return true;}}); }

}

“`現在適合新手了,慢慢研究吧,一次刪掉了很多東西

總結

以上是生活随笔為你收集整理的安卓-橡皮擦擦线完整实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。