Androidパネル(簡単なカスタムコントロール)


この时间はいくつかのカスタムコントロールをして、ブログに整理してみんなの参考にして、まず画板の効果図を见ます:この画板はとても简単ですが、基本的な机能はすべて持っていて、消しゴム、除去、取り消し、逆取り消し、保存.ブラシの色やサイズを変更するなど、より多くの機能を実現するには、コードを追加し続けてください.この画板を実現する論理は簡単です.画板コントロールをカスタマイズします.主なコードを見てみましょう.
public class DrawingBoardView extends View {

    //      (     )
    private DrawMode mDrawMode = DrawMode.PaintMode;
    //   
    private Paint mPaint;
    //     
    private int mPaintColor = Color.RED;
    //     
    private int mPaintSize = diptopx(5);
    //       
    private int mEraserSize = diptopx(36);
    //      
    private Bitmap mBufferBitmap;
    //      
    private Canvas mBufferCanvas;
    //       
    private int mWidth;
    //       
    private int mHight;
    //      
    private int mCanvasColor = Color.WHITE;
    //      
    private float mLastX;
    private float mLastY;
    //   
    private Path mPath;
    //            
    private PorterDuffXfermode mEraserMode = new PorterDuffXfermode(PorterDuff.Mode.DST_OUT);
    //      
    private List savePaths;
    //      
    private List currPaths;
    //     20   
    private int MAX_PATH = 20;


    public DrawingBoardView(Context context) {
        this(context, null);
    }

    public DrawingBoardView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public DrawingBoardView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initPath();
        initPaint();
    }

    /**
     *      
     */
    private void initPath() {
        mPath = new Path();
        savePaths = new ArrayList();
        currPaths = new ArrayList();
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        mWidth = MeasureSpec.getSize(widthMeasureSpec);
        mHight = MeasureSpec.getSize(heightMeasureSpec);
        setMeasuredDimension(mWidth, mHight);
        initCanvas();
    }

    /**
     *        
     */
    private void initCanvas() {
        //     BITMAP
        mBufferBitmap = Bitmap.createBitmap(mWidth, mHight, Bitmap.Config.ARGB_8888);
        //       ,  mBufferCanvas          mBufferBitmap 
        mBufferCanvas = new Canvas(mBufferBitmap);
        //       
        mBufferCanvas.drawColor(mCanvasColor);
    }

    /**
     *      
     */
    private void initPaint() {
        //           
        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);
        //      
        mPaint.setStyle(Paint.Style.STROKE);
        //       
        mPaint.setColor(mPaintColor);
        //       
        mPaint.setStrokeWidth(mPaintSize);
        //       
        mPaint.setStrokeJoin(Paint.Join.ROUND);
        //          
        mPaint.setStrokeCap(Paint.Cap.ROUND);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawBitmap(mBufferBitmap, 0, 0, null);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        float x = event.getX();
        float y = event.getY();
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                mLastX = x;
                mLastY = y;
                mPath.moveTo(mLastX, mLastY);
                break;
            case MotionEvent.ACTION_MOVE:
                //     
                mPath.quadTo(mLastX, mLastY, (mLastX + x) / 2, (mLastY + y) / 2);
                mBufferCanvas.drawPath(mPath, mPaint);
                invalidate();
                mLastX = x;
                mLastY = y;
                break;
            case MotionEvent.ACTION_UP:
                //     
                saveDrawPaths();
                mPath.reset();
                break;
        }
        return true;
    }

    /**
     *       
     */
    private void saveDrawPaths() {
        if (savePaths.size() == MAX_PATH) {
            savePaths.remove(0);
        }
        savePaths.clear();
        savePaths.addAll(currPaths);
        Path cachePath = new Path(mPath);
        Paint cachePaint = new Paint(mPaint);
        savePaths.add(new DrawPathInfo(cachePaint, cachePath));
        currPaths.add(new DrawPathInfo(cachePaint, cachePath));
    }

    public int diptopx(float dipValue) {
        final float scale = this.getResources().getDisplayMetrics().density;
        return (int) (dipValue * scale + 0.5f);
    }

    /**
     *     
     */
    public void clean() {
        savePaths.clear();
        currPaths.clear();
        //         
        mBufferBitmap.eraseColor(Color.TRANSPARENT);
        invalidate();
    }

    /**
     *       
     *
     * @param mode
     */
    public void setMode(DrawMode mode) {
        if (mode != mDrawMode) {
            if (mode == DrawMode.EraserMode) {
                mPaint.setStrokeWidth(mEraserSize);
                mPaint.setXfermode(mEraserMode);
                mPaint.setColor(mCanvasColor);
            } else {
                mPaint.setXfermode(null);
                mPaint.setColor(mPaintColor);
                mPaint.setStrokeWidth(mPaintSize);
            }
            mDrawMode = mode;
        }
    }

    /**
     *       
     *
     * @return
     */
    public DrawMode getMode() {
        return mDrawMode;
    }

    /**
     *        
     */
    public void lastStep() {
        if (currPaths.size() > 0) {
            currPaths.remove(currPaths.size() - 1);
            redrawBitmap();
        }
    }

    /**
     *         
     */
    public void nextStep() {
        if (currPaths != savePaths) {
            if (savePaths.size() > currPaths.size()) {
                currPaths.add(savePaths.get(currPaths.size()));
                redrawBitmap();
            }
        }
    }

    /**
     *     
     */
    private void redrawBitmap() {
        mBufferBitmap.eraseColor(Color.TRANSPARENT);
        for (int i = 0; i < currPaths.size(); i++) {
            DrawPathInfo path = currPaths.get(i);
            mBufferCanvas.drawPath(path.getPath(), path.getPaint());
        }
        invalidate();
    }

    /**
     *      
     */
    public void save() {
        mBufferCanvas.save(Canvas.ALL_SAVE_FLAG);
        mBufferCanvas.restore();
        String path = Environment.getExternalStorageDirectory().getPath();
        //    
        File appDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
        if (appDir == null) {
            return;
        }
        String fileName = System.currentTimeMillis() + ".jpg";
        File file = new File(appDir, fileName);
        try {
            FileOutputStream fileOutputStream = new FileOutputStream(file);
            mBufferBitmap.compress(Bitmap.CompressFormat.JPEG, 100, fileOutputStream);
            fileOutputStream.close();
            Toast.makeText(getContext(), "    ", Toast.LENGTH_SHORT).show();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

ソースコードはすでにGitHubにアップロードして、farkを歓迎して、starはクリックしてGitHubソースコードを表示します