自定義view實(shí)現(xiàn)涂鴉(畫板)功能 (一)

之前在csdn上發(fā)了一次,之后可能轉(zhuǎn)戰(zhàn)簡(jiǎn)書了,為避免發(fā)發(fā)(二)的時(shí)候讓人不明所以,所以決定還是重發(fā)一次保證完整性
新手寫的比較low,主要目的還是讓自己長(zhǎng)記性怕時(shí)間長(zhǎng)忘記了,所以簡(jiǎn)單記錄下
csdn自定義view實(shí)現(xiàn)涂鴉(畫板)功能

下面進(jìn)入正文:

介紹

自定義view實(shí)現(xiàn)涂鴉功能,包括撤銷、恢復(fù)、重做、保存以及橡皮擦(在風(fēng)格中實(shí)現(xiàn))功能,小模塊包括畫筆顏色調(diào)整、畫筆尺寸調(diào)整、畫筆類型(包括正常畫筆以及橡皮擦功能),之后又陸續(xù)實(shí)現(xiàn)了畫圓、畫矩形以及畫箭頭的功能,這里我們先完成前面的需求

功能模塊

撤銷:
/** 
     * 撤銷 
     * 撤銷的核心思想就是將畫布清空, 
     * 將保存下來(lái)的Path路徑最后一個(gè)移除掉, 
     * 重新將路徑畫在畫布上面。 
     */  
    public void undo() {  
        if (savePath != null && savePath.size() > 0) {  
            DrawPath drawPath = savePath.get(savePath.size() - 1);  
            deletePath.add(drawPath);  
            savePath.remove(savePath.size() - 1);  
            redrawOnBitmap();  
        }  
    }  
重做:
/** 
     * 重做:重做的思路就更簡(jiǎn)單了就是刪除所有已保存的路徑即可 
     * 但是我建議將刪除的路徑存入另一個(gè)集合可以用來(lái)恢復(fù) 
    */  
    public void redo() {  
        if (savePath != null && savePath.size() > 0) {  
            savePath.clear();  
            redrawOnBitmap();  
        }  
    }  
完成以上兩項(xiàng)功能的重要模塊:
private void redrawOnBitmap() {  
        initCanvas();  
        Iterator<DrawPath> iter = savePath.iterator();  
        while (iter.hasNext()) {  
            DrawPath drawPath = iter.next();  
            mCanvas.drawPath(drawPath.path, drawPath.paint);  
        }  
        invalidate();// 刷新  
    }  

原理:通過onTouch()方法完成,當(dāng)down時(shí)創(chuàng)建path類,并記錄起點(diǎn),up時(shí)獲取重點(diǎn)位置,并將該條路徑存入path實(shí)體類中,之后將該path存入一個(gè)集合savepath集合中。撤銷時(shí),刪除最上層的path,重做則是刪除所有path即可。

恢復(fù):
/** 
     * 恢復(fù),恢復(fù)的核心就是將刪除的那條路徑重新添加到savapath中重新繪畫即可 
     */  
    public void recover() {  
        if (deletePath.size() > 0) {  
            //將刪除的路徑列表中的最后一個(gè),也就是最頂端路徑取出(棧),并加入路徑保存列表中  
            DrawPath dp = deletePath.get(deletePath.size() - 1);  
            savePath.add(dp);  
            //將取出的路徑重繪在畫布上  
            mCanvas.drawPath(dp.path, dp.paint);  
            //將該路徑從刪除的路徑列表中去除  
            deletePath.remove(deletePath.size() - 1);  
            invalidate();  
        }  
    }  

原理很簡(jiǎn)單存到本地即可,但是我們?cè)诖鎯?chǔ)時(shí)可以記錄當(dāng)前時(shí)間,以當(dāng)前時(shí)間為圖片名字以示區(qū)別,注意:可以發(fā)廣播,不發(fā)的話可能造成用戶無(wú)法在圖庫(kù)中查看到(如果配置的是臨時(shí)路徑建議不添加)

樣式修改:畫板樣式,畫筆尺寸,畫筆顏色

//以下為樣式修改內(nèi)容  
    //設(shè)置畫筆樣式  
    public void selectPaintStyle(int which) {  
        if (which == 0) {  
            currentStyle = 1;  
            setPaintStyle();  
        }  
        //當(dāng)選擇的是橡皮擦?xí)r,設(shè)置顏色為白色  
        if (which == 1) {  
            currentStyle = 2;  
            setPaintStyle();  
            mPaint.setStrokeWidth(20);  
        }  
    }  
    //選擇畫筆大小  
    public void selectPaintSize(int which){  
        int size =Integer.parseInt(this.getResources().getStringArray(R.array.paintsize)[which]);  
        currentSize = size;  
        setPaintStyle();  
    }  
    //設(shè)置畫筆顏色  
    public void selectPaintColor(int which){  
        currentColor = paintColor[which];  
        setPaintStyle();  
    }  
//初始化畫筆樣式  
    private void setPaintStyle() {  
        mPaint = new Paint();  
        mPaint.setStyle(Paint.Style.STROKE);  
        mPaint.setStrokeJoin(Paint.Join.ROUND);// 設(shè)置外邊緣  
        mPaint.setStrokeCap(Paint.Cap.ROUND);// 形狀  
        mPaint.setAntiAlias(true);  
        mPaint.setDither(true);  
        if (currentStyle == 1) {//普通畫筆功能  
            mPaint.setStrokeWidth(currentSize);  
            mPaint.setColor(currentColor);  
        } else {//橡皮擦  
            mPaint.setAlpha(0);  
            mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));//這兩個(gè)方法一起使用才能出現(xiàn)橡皮擦效果  
            mPaint.setColor(Color.TRANSPARENT);  
            mPaint.setStrokeWidth(50);  
            currentDrawGraphics = DRAW_PATH;//使用橡皮擦?xí)r默認(rèn)用線的方式擦除  
        }  
    }

橡皮擦功能:
基本原理:橡皮擦就是用和畫布顏色一致顏色的畫筆在屏幕觸摸,簡(jiǎn)接實(shí)現(xiàn)橡皮擦的功能。
1)初始化畫筆,并且設(shè)置畫筆的顏色為白色(這里其實(shí)要設(shè)置為畫布的顏色)。
2)設(shè)置畫筆的大小為合適的大小。
3)用一個(gè)變量記住橡皮擦的顏色,用于在其他操作后重新使用橡皮擦。

以上為簡(jiǎn)易的橡皮擦主要使用白色來(lái)覆蓋,但當(dāng)背景圖為一張照片時(shí)是不可行的,因?yàn)榘咨珪?huì)很明顯的展示在背景圖上,而且需要注意的是:即使是將畫筆顏色變?yōu)橥该魃彩遣豢尚械?,綜上我們選擇用渲染模式來(lái)處理
這里選擇渲染模式Xfermode的DIS_IN,這樣我們處理后會(huì)發(fā)現(xiàn)出現(xiàn)黑色陰影邊框,效果實(shí)現(xiàn)了,但是bug非常明顯
之后選擇渲染模式的CLEAR這個(gè)模式會(huì)擦除所有像素點(diǎn),但是發(fā)現(xiàn)是以黑色線條的形式去擦除的
通過STACK OVER FLOW網(wǎng)站超找到兩種解決辦法:
1.改變touch_move方法的path畫圖的相關(guān)方法,效果實(shí)現(xiàn)了但是對(duì)撤銷和重做造成了一定影響,最終沒有選用

private void touch_move(float x, float y) {  
        float dx = Math.abs(x - mX);  
        float dy = Math.abs(mY - y);  
        if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {  
            // 從x1,y1到x2,y2畫一條貝塞爾曲線,更平滑(直接用mPath.lineTo也可以)  
           // mPath.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2);  
            mPath.lineTo(mX, mY);  
            mCanvas.drawPath(mPath, mPaint);  
            //將一條完整的路徑保存下來(lái)(相當(dāng)于入棧操作)  
            savePath.add(dp);  
            mPath.reset();  
            mPath.moveTo(mX, mY);  
            mX = x;  
            mY = y;  
        }  
    }  
    private void touch_up() {  
        mPath = null;// 重新置空  
        //mPath.reset();  
    } 

2.最終發(fā)現(xiàn)只需要設(shè)置默認(rèn)type就能解決該問題

setLayerType(LAYER_TYPE_SOFTWARE,null);//設(shè)置默認(rèn)樣式,去除dis-in的黑色方框以及clear模式的黑線效果

橡皮擦相關(guān)代碼:

if (currentStyle == 1) {//正常畫筆  
            mPaint.setStrokeWidth(currentSize);  
            mPaint.setColor(currentColor);  
        } else {//橡皮擦  
            mPaint.setAlpha(0);  
            mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));  
            mPaint.setColor(Color.TRANSPARENT);  
            mPaint.setStrokeWidth(50);  
        }  

注意 mPaint.setAlpha(0);mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));兩者搭配使用

設(shè)置畫筆大小的功能:
1)初始化畫筆。
2)設(shè)置畫筆的大小為所選擇的大小。
3)用一個(gè)變量記住當(dāng)前畫筆的大小,用于在進(jìn)行其他操作后還保持之前設(shè)置的畫筆大小。

設(shè)置畫筆顏色的功能:
1)初始化畫筆。
2)設(shè)置畫筆的顏色為所選擇的顏色。
3)用一個(gè)變量記住當(dāng)前畫筆的顏色,用于在進(jìn)行其他操作后還保持之前設(shè)置的畫筆顏色。

以下為完整代碼:
效果:

20160527170522184.png

自定義TuyaView:

/** 
 *  
 * View實(shí)現(xiàn)涂鴉、撤銷以及重做功能 
 */  
import android.content.Context;  
import android.content.Intent;  
import android.graphics.Bitmap;  
import android.graphics.Bitmap.CompressFormat;  
import android.graphics.BitmapFactory;  
import android.graphics.Canvas;  
import android.graphics.Color;  
import android.graphics.Matrix;  
import android.graphics.Paint;  
import android.graphics.Path;  
import android.graphics.PorterDuff;  
import android.graphics.PorterDuffXfermode;  
import android.net.Uri;  
import android.os.Environment;  
import android.util.Log;  
import android.view.MotionEvent;  
import android.view.View;  
import java.io.File;  
import java.io.FileOutputStream;  
import java.text.SimpleDateFormat;  
import java.util.ArrayList;  
import java.util.Date;  
import java.util.Iterator;  
import java.util.List;  
public class TuyaView extends View {  
    private Context context;  
    private Bitmap mBitmap;  
    private Canvas mCanvas;  
    private Path mPath;  
    private Paint mBitmapPaint;// 畫布的畫筆  
    private Paint mPaint;// 真實(shí)的畫筆  
    private float mX, mY;// 臨時(shí)點(diǎn)坐標(biāo)  
    private static final float TOUCH_TOLERANCE = 4;  
    // 保存Path路徑的集合  
    private static List<DrawPath> savePath;  
    // 保存已刪除Path路徑的集合  
    private static List<DrawPath> deletePath;  
    // 記錄Path路徑的對(duì)象  
    private DrawPath dp;  
    private int screenWidth, screenHeight;  
    private int currentColor = Color.RED;  
    private int currentSize = 5;  
    private int currentStyle = 1;  
    private int[] paintColor;//顏色集合  
    private class DrawPath {  
        public Path path;// 路徑  
        public Paint paint;// 畫筆  
    }  
    public TuyaView(Context context, int w, int h) {  
        super(context);  
        this.context = context;  
        screenWidth = w;  
        screenHeight = h;  
        paintColor = new int[]{  
                Color.RED, Color.BLUE, Color.GREEN, Color.YELLOW, Color.BLACK, Color.GRAY, Color.CYAN  
        };  
        setLayerType(LAYER_TYPE_SOFTWARE,null);//設(shè)置默認(rèn)樣式,去除dis-in的黑色方框以及clear模式的黑線效果  
        initCanvas();  
        savePath = new ArrayList<DrawPath>();  
        deletePath = new ArrayList<DrawPath>();  
    }  
    public void initCanvas() {  
        setPaintStyle();  
        mBitmapPaint = new Paint(Paint.DITHER_FLAG);  
        //畫布大小  
        mBitmap = Bitmap.createBitmap(screenWidth, screenHeight, Bitmap.Config.ARGB_8888);  
        mBitmap.eraseColor(Color.argb(0, 0, 0, 0));  
        mCanvas = new Canvas(mBitmap);  //所有mCanvas畫的東西都被保存在了mBitmap中  
        mCanvas.drawColor(Color.TRANSPARENT);  
    }  
    //初始化畫筆樣式  
    private void setPaintStyle() {  
        mPaint = new Paint();  
        mPaint.setStyle(Paint.Style.STROKE);  
        mPaint.setStrokeJoin(Paint.Join.ROUND);// 設(shè)置外邊緣  
        mPaint.setStrokeCap(Paint.Cap.ROUND);// 形狀  
        mPaint.setAntiAlias(true);  
        mPaint.setDither(true);  
        if (currentStyle == 1) {  
            mPaint.setStrokeWidth(currentSize);  
            mPaint.setColor(currentColor);  
        } else {//橡皮擦  
            mPaint.setAlpha(0);  
            mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));  
            mPaint.setColor(Color.TRANSPARENT);  
            mPaint.setStrokeWidth(50);  
        }  
    }  
    @Override  
    public void onDraw(Canvas canvas) {  
        //canvas.drawColor(0xFFAAAAAA);  
        // 將前面已經(jīng)畫過得顯示出來(lái)  
        canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);  
        if (mPath != null) {  
            // 實(shí)時(shí)的顯示  
            canvas.drawPath(mPath, mPaint);  
        }  
    }  
    private void touch_start(float x, float y) {  
        mPath.moveTo(x, y);  
        mX = x;  
        mY = y;  
    }  
    private void touch_move(float x, float y) {  
        float dx = Math.abs(x - mX);  
        float dy = Math.abs(mY - y);  
        if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {  
            // 從x1,y1到x2,y2畫一條貝塞爾曲線,更平滑(直接用mPath.lineTo也可以)  
            mPath.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2);  
            //mPath.lineTo(mX,mY);  
            mX = x;  
            mY = y;  
        }  
    }  
    private void touch_up() {  
        mPath.lineTo(mX, mY);  
        mCanvas.drawPath(mPath, mPaint);  
        //將一條完整的路徑保存下來(lái)  
        savePath.add(dp);  
        mPath = null;// 重新置空  
    }  
    /** 
     * 撤銷 
     * 撤銷的核心思想就是將畫布清空, 
     * 將保存下來(lái)的Path路徑最后一個(gè)移除掉, 
     * 重新將路徑畫在畫布上面。 
     */  
    public void undo() {  
        if (savePath != null && savePath.size() > 0) {  
            DrawPath drawPath = savePath.get(savePath.size() - 1);  
            deletePath.add(drawPath);  
            savePath.remove(savePath.size() - 1);  
            redrawOnBitmap();  
        }  
    }  
    /** 
     * 重做 
     */  
    public void redo() {  
        if (savePath != null && savePath.size() > 0) {  
            savePath.clear();  
            redrawOnBitmap();  
        }  
    }  
    private void redrawOnBitmap() {  
        /*mBitmap = Bitmap.createBitmap(screenWidth, screenHeight, 
                Bitmap.Config.RGB_565); 
        mCanvas.setBitmap(mBitmap);// 重新設(shè)置畫布,相當(dāng)于清空畫布*/  
        initCanvas();  
        Iterator<DrawPath> iter = savePath.iterator();  
        while (iter.hasNext()) {  
            DrawPath drawPath = iter.next();  
            mCanvas.drawPath(drawPath.path, drawPath.paint);  
        }  
        invalidate();// 刷新  
    }  
    /** 
     * 恢復(fù),恢復(fù)的核心就是將刪除的那條路徑重新添加到savapath中重新繪畫即可 
     */  
    public void recover() {  
        if (deletePath.size() > 0) {  
            //將刪除的路徑列表中的最后一個(gè),也就是最頂端路徑取出(棧),并加入路徑保存列表中  
            DrawPath dp = deletePath.get(deletePath.size() - 1);  
            savePath.add(dp);  
            //將取出的路徑重繪在畫布上  
            mCanvas.drawPath(dp.path, dp.paint);  
            //將該路徑從刪除的路徑列表中去除  
            deletePath.remove(deletePath.size() - 1);  
            invalidate();  
        }  
    }  
    @Override  
    public boolean onTouchEvent(MotionEvent event) {  
        float x = event.getX();  
        float y = event.getY();  
        switch (event.getAction()) {  
            case MotionEvent.ACTION_DOWN:  
                // 每次down下去重新new一個(gè)Path  
                mPath = new Path();  
                //每一次記錄的路徑對(duì)象是不一樣的  
                dp = new DrawPath();  
                dp.path = mPath;  
                dp.paint = mPaint;  
                touch_start(x, y);  
                invalidate();  
                break;  
            case MotionEvent.ACTION_MOVE:  
                touch_move(x, y);  
                invalidate();  
                break;  
            case MotionEvent.ACTION_UP:  
                touch_up();  
                invalidate();  
                break;  
        }  
        return true;  
    }  
    //保存到sd卡  
    public void saveToSDCard() {  
        //獲得系統(tǒng)當(dāng)前時(shí)間,并以該時(shí)間作為文件名  
        SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");  
        Date curDate = new Date(System.currentTimeMillis());//獲取當(dāng)前時(shí)間  
        String str = formatter.format(curDate) + "paint.png";  
        File file = new File("sdcard/" + str);  
        FileOutputStream fos = null;  
        try {  
            fos = new FileOutputStream(file);  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
        mBitmap.compress(CompressFormat.PNG, 100, fos);  
        //發(fā)送Sd卡的就緒廣播,要不然在手機(jī)圖庫(kù)中不存在  
        Intent intent = new Intent(Intent.ACTION_MEDIA_MOUNTED);  
        intent.setData(Uri.fromFile(Environment.getExternalStorageDirectory()));  
        context.sendBroadcast(intent);  
        Log.e("TAG", "圖片已保存");  
    }  
    //以下為樣式修改內(nèi)容  
    //設(shè)置畫筆樣式  
    public void selectPaintStyle(int which) {  
        if (which == 0) {  
            currentStyle = 1;  
            setPaintStyle();  
        }  
        //當(dāng)選擇的是橡皮擦?xí)r,設(shè)置顏色為白色  
        if (which == 1) {  
            currentStyle = 2;  
            setPaintStyle();  
        }  
    }  
    //選擇畫筆大小  
    public void selectPaintSize(int which) {  
        //int size = Integer.parseInt(this.getResources().getStringArray(R.array.paintsize)[which]);  
        currentSize = which;  
        setPaintStyle();  
    }  
    //設(shè)置畫筆顏色  
    public void selectPaintColor(int which) {  
        currentColor = paintColor[which];  
        setPaintStyle();  
    }  
}  

MainActivity:

package com.banhai.paintboard;  
import android.content.DialogInterface;  
import android.support.v7.app.AlertDialog;  
import android.support.v7.app.AppCompatActivity;  
import android.os.Bundle;  
import android.view.Display;  
import android.view.View;  
import android.view.Window;  
import android.widget.Button;  
import android.widget.FrameLayout;  
import android.widget.SeekBar;  
import android.widget.Toast;  
public class MainActivity extends AppCompatActivity implements View.OnClickListener{  
    private FrameLayout frameLayout;  
    private Button btn_undo;  
    private Button btn_redo;  
    private Button btn_save;  
    private Button btn_recover;  
    private TuyaView tuyaView;//自定義涂鴉板  
    private Button btn_paintcolor;  
    private Button btn_paintsize;  
    private Button btn_paintstyle;  
    private SeekBar sb_size;  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        requestWindowFeature(Window.FEATURE_NO_TITLE);  
        setContentView(R.layout.activity_main);  
        initView();  
        initData();  
        initListener();  
    }  
    private void initView() {  
        frameLayout = (FrameLayout) findViewById(R.id.fl_boardcontainer);  
        btn_undo = (Button) findViewById(R.id.btn_last);  
        btn_redo = (Button) findViewById(R.id.btn_redo);  
        btn_save = (Button) findViewById(R.id.btn_savesd);  
        btn_recover = (Button) findViewById(R.id.btn_recover);  
        btn_paintcolor = (Button) findViewById(R.id.btn_paintcolor);  
        btn_paintsize = (Button) findViewById(R.id.btn_paintsize);  
        btn_paintstyle = (Button) findViewById(R.id.btn_paintstyle);  
        sb_size = (SeekBar) findViewById(R.id.sb_size);  
    }  
    private void initData() {  
        //雖然此時(shí)獲取的是屏幕寬高,但是我們可以通過控制framlayout來(lái)實(shí)現(xiàn)控制涂鴉板大小  
        Display defaultDisplay = getWindowManager().getDefaultDisplay();  
        int screenWidth = defaultDisplay.getWidth();  
        int screenHeight = defaultDisplay.getHeight();  
        tuyaView = new TuyaView(this,screenWidth,screenHeight);  
        frameLayout.addView(tuyaView);  
        tuyaView.requestFocus();  
        tuyaView.selectPaintSize(sb_size.getProgress());  
    }  
    private void initListener() {  
        btn_undo.setOnClickListener(this);  
        btn_redo.setOnClickListener(this);  
        btn_save.setOnClickListener(this);  
        btn_recover.setOnClickListener(this);  
        btn_paintcolor.setOnClickListener(this);  
        btn_paintsize.setOnClickListener(this);  
        btn_paintstyle.setOnClickListener(this);  
        sb_size.setOnSeekBarChangeListener(new MySeekChangeListener());  
    }  
     class MySeekChangeListener implements SeekBar.OnSeekBarChangeListener {  
        @Override  
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {  
            tuyaView.selectPaintSize(seekBar.getProgress());  
            //Toast.makeText(MainActivity.this,"當(dāng)前畫筆尺寸為"+seekBar.getProgress(),Toast.LENGTH_SHORT ).show();  
        }  
         @Override  
         public void onStartTrackingTouch(SeekBar seekBar) {  
             tuyaView.selectPaintSize(seekBar.getProgress());  
             //Toast.makeText(MainActivity.this,"當(dāng)前畫筆尺寸為"+seekBar.getProgress(),Toast.LENGTH_SHORT ).show();  
         }  
         @Override  
        public void onStopTrackingTouch(SeekBar seekBar) {}  
    }  
    @Override  
    public void onClick(View v) {  
        switch (v.getId()){  
            case R.id.btn_last://撤銷  
                tuyaView.undo();  
                break;  
            case R.id.btn_redo://重做  
                tuyaView.redo();  
                break;  
            case R.id.btn_recover://恢  
                tuyaView.recover();  
                break;  
            case R.id.btn_savesd://保存  
                tuyaView.saveToSDCard();  
                break;  
            case R.id.btn_paintcolor:  
                sb_size.setVisibility(View.GONE);  
                showPaintColorDialog(v);  
                break;  
            case R.id.btn_paintsize:  
                sb_size.setVisibility(View.VISIBLE);  
                break;  
            case R.id.btn_paintstyle:  
                sb_size.setVisibility(View.GONE);  
                showMoreDialog(v);  
                break;  
        }  
    }  
    private int select_paint_color_index = 0;  
    private int select_paint_style_index = 0;  
    //private int select_paint_size_index = 0;  
    public void showPaintColorDialog(View parent){  
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);  
        alertDialogBuilder.setTitle("選擇畫筆顏色:");  
        alertDialogBuilder.setSingleChoiceItems(R.array.paintcolor, select_paint_color_index, new DialogInterface.OnClickListener() {  
            @Override  
            public void onClick(DialogInterface dialog, int which) {  
                select_paint_color_index = which;  
                tuyaView.selectPaintColor(which);  
                dialog.dismiss();  
            }  
        });  
        alertDialogBuilder.setNegativeButton("取消", new DialogInterface.OnClickListener() {  
            @Override  
            public void onClick(DialogInterface dialog, int which) {  
                dialog.dismiss();  
            }  
        });  
        alertDialogBuilder.create().show();  
    }  
/* 
//彈出畫筆大小選項(xiàng)對(duì)話框 
    public void showPaintSizeDialog(View parent){ 
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this); 
        alertDialogBuilder.setTitle("選擇畫筆大小:"); 
        alertDialogBuilder.setSingleChoiceItems(R.array.paintsize, select_paint_size_index, new DialogInterface.OnClickListener() { 
            @Override 
            public void onClick(DialogInterface dialog, int which) { 
                select_paint_size_index = which; 
                tuyaView.selectPaintSize(which); 
                dialog.dismiss(); 
            } 
        }); 
        alertDialogBuilder.setNegativeButton("取消", new DialogInterface.OnClickListener() { 
            @Override 
            public void onClick(DialogInterface dialog, int which) { 
                dialog.dismiss(); 
            } 
        }); 
        alertDialogBuilder.create().show(); 
    } 
*/  
//彈出選擇畫筆或橡皮擦的對(duì)話框  
    public void showMoreDialog(View parent){  
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);  
        alertDialogBuilder.setTitle("選擇畫筆或橡皮擦:");  
        alertDialogBuilder.setSingleChoiceItems(R.array.paintstyle, select_paint_style_index, new DialogInterface.OnClickListener() {  
            @Override  
            public void onClick(DialogInterface dialog, int which) {  
                select_paint_style_index = which;  
                tuyaView.selectPaintStyle(which);  
                dialog.dismiss();  
            }  
        });  
        alertDialogBuilder.setNegativeButton("取消", new DialogInterface.OnClickListener() {  
            @Override  
            public void onClick(DialogInterface dialog, int which) {  
                dialog.dismiss();  
            }  
        });  
        alertDialogBuilder.create().show();  
    }  
}  
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,334評(píng)論 4 61
  • 親聞私耳語(yǔ), 仙請(qǐng)赴天霆。 惶恐閑云客, 疑為在幔亭。 文/閑云 2017.03.02
    2b4c67af34a7閱讀 343評(píng)論 1 0
  • “我昨天晚上夢(mèng)到你了。” 我們很久不聯(lián)系了。我,她和另外兩個(gè)女孩是小學(xué)很有名的“時(shí)代姐妹花”。她是林蕭,雯是顧里,...
    老煙嗓和小奶音YE閱讀 281評(píng)論 0 0
  • 浣溪沙 · 題青花瓷雕“采茶”(步客家葦?shù)秧崳?頂笠未將容玉遮,身姿婀娜綻青花。手提巧籃采春芽。 側(cè)耳肩頭飄蝶影,...
    補(bǔ)缺樓丨胡德棒閱讀 391評(píng)論 2 4
  • javascript中apply、call和bind的區(qū)別 在JS中,這三者都是用來(lái)改變函數(shù)的this對(duì)象的指向的...
    lyzaijs閱讀 8,432評(píng)論 1 23

友情鏈接更多精彩內(nèi)容