0

我目前正在为孩子们开发一个着色应用程序。创建用于着色的图像画布。该图像是PNG,我正在尝试为图像着色,以便图像不会被油漆或颜色覆盖。我非常接近构建应用程序,但问题是我没有得到以某种方式为图像着色的提示,以便图像保留在前面,颜色保留在后面这是我的代码

public class FingerPaint extends Activity {
    LinearLayout mainContainer;
    LinearLayout buttonContainer;
    LinearLayout.LayoutParams ![enter image description here][1]btnParams;
    Button btnText, btnSketch, btnColor, btnUndo, btnRedo, btnDone,btnClear;
    // MyView drawView;
    DrawingPanel drawView;
    int lastColor = 0xFFFF0000;
    public static final int SUCCESS = 200;

    private final String TAG = getClass().getSimpleName();
    private String textToDraw = null;
    private boolean isTextModeOn = false;
    private Canvas mCanvas;
    private Path mPath;
    private Paint mPaint, mBitmapPaint;
    private ArrayList<PathPoints> paths = new ArrayList<PathPoints>();
    private ArrayList<PathPoints> undonePaths = new ArrayList<PathPoints>();
    private Bitmap mBitmap;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        generateViews();
    }
    public static void displayAlert(Context context, String msg) {
        AlertDialog.Builder alert = new AlertDialog.Builder(context);
        alert.setMessage(context.getString(R.string.app_name));
        alert.setMessage(msg);
        alert.setPositiveButton(context.getString(R.string.btn_ok),
                new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        // TODO Auto-generated method stub

                    }
                });
        alert.show();
    }
    private void generateViews() {
        btnDone = new Button(this);
        btnDone.setLayoutParams(new LinearLayout.LayoutParams(
                LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
        btnDone.setText(getString(R.string.btn_done));
        btnText = new Button(this);
        btnClear = new Button(this);
        btnSketch = new Button(this);
        btnColor = new Button(this);
        btnUndo = new Button(this);
        btnRedo = new Button(this);

        mainContainer = new LinearLayout(this);
        mainContainer.setLayoutParams(new LinearLayout.LayoutParams(
                LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
        mainContainer.setOrientation(LinearLayout.VERTICAL);
        buttonContainer = new LinearLayout(this);
        buttonContainer.setLayoutParams(new LinearLayout.LayoutParams(
                LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
        buttonContainer.setOrientation(LinearLayout.HORIZONTAL);
        btnParams = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,
                LayoutParams.WRAP_CONTENT, 1);

        btnText.setText("Text");
        btnText.setLayoutParams(btnParams);
        btnClear.setText("Clear");
        btnClear.setLayoutParams(btnParams);
        btnSketch.setText("Sketch");
        btnSketch.setLayoutParams(btnParams);
        btnColor.setText("Color");
        btnColor.setLayoutParams(btnParams);
        btnUndo.setText("Undo");
        btnUndo.setLayoutParams(btnParams);
        btnRedo.setText("Redo");
        btnRedo.setLayoutParams(btnParams);
        buttonContainer.addView(btnText);
        buttonContainer.addView(btnClear);
        buttonContainer.addView(btnSketch);
        buttonContainer.addView(btnColor);
        buttonContainer.addView(btnUndo);
        buttonContainer.addView(btnRedo);

        drawView = new DrawingPanel(this, lastColor);
        drawView.setDrawingCacheEnabled(true);
        drawView.measure(
                MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
                MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
        drawView.layout(0, 0, drawView.getMeasuredWidth(),
                drawView.getMeasuredHeight());
        drawView.buildDrawingCache(true);
        drawView.setLayoutParams(new LinearLayout.LayoutParams(
                LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT, 1));
        mainContainer.addView(btnDone);
        mainContainer.addView(drawView);
        mainContainer.addView(buttonContainer);
        setContentView(mainContainer);
        btnSketch.setSelected(true);
        btnText.setOnClickListener(new OnClickListener() {
        //text
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            resetButtons();
            btnText.setSelected(true);
            AlertDialog.Builder alert = new AlertDialog.Builder(
                    FingerPaint.this);
            alert.setMessage(getString(R.string.msg_enter_text_to_draw));
            final EditText edText = new EditText(FingerPaint.this);
            alert.setView(edText);
            alert.setPositiveButton(R.string.btn_ok,
                    new DialogInterface.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog,
                                int which) {
                            // TODO Auto-generated method stub
                            if (edText.getText().toString().length() > 0) {
                                textToDraw = edText.getText().toString();
                                isTextModeOn = true;
                                displayAlert(FingerPaint.this,
                                        getString(R.string.msg_tap_image));
                            } else {
                                displayAlert(
                                        FingerPaint.this,
                                        getString(R.string.msg_enter_text_to_draw));
                            }
                        }
                    });
            alert.setNegativeButton(R.string.btn_cancel,
                    new DialogInterface.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog,
                                int which) {
                            // TODO Auto-generated method stub
                            isTextModeOn = false;
                        }
                    });
            alert.show();
        }
    });

/// clear
        btnClear.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                //mBitmap.eraseColor(Color.TRANSPARENT);
                mPath.reset();
                paths.removeAll(paths);
                undonePaths.removeAll(undonePaths);
                drawView.invalidate();
            }
        });

    ////sketch
    btnSketch.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            resetButtons();
            btnSketch.setSelected(true);
            isTextModeOn = false;
        }
    });
    //color
/*  btnColor.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            AmbilWarnaDialog dialog = new AmbilWarnaDialog(
                    FingerPaint.this, lastColor,
                    new OnAmbilWarnaListener() {
                        @Override
                        public void onOk(AmbilWarnaDialog dialog, int color) {
                            // color is the color selected by the user.
                            colorChanged(color);
                        }

                        @Override
                        public void onCancel(AmbilWarnaDialog dialog) {
                            // cancel was selected by the user
                        }
                    });

            dialog.show();
        }
    });*/
//undo
    btnUndo.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            drawView.onClickUndo();
        }
    });//redo
    btnRedo.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            drawView.onClickRedo();
        }
    });
    //done
    btnDone.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            /*Log.v(TAG, "Here");
            Bitmap editedImage = Bitmap.createBitmap(drawView
                    .getDrawingCache());
            editedImage = Bitmap.createScaledBitmap(editedImage, 200, 300,
                    true);
            if (editedImage != null) {
                Intent intent = new Intent();
                //intent.putExtra(ChooseActivity.BITMAP, editedImage);
                // AddReportItemActivity.mPhoto =
                // drawView.getDrawingCache();
                setResult(SUCCESS, intent);
                finish();
            }
        }*/
            AlertDialog.Builder editalert = new AlertDialog.Builder(FingerPaint.this);
            editalert.setTitle("Please Enter the name with which you want to Save");
            final EditText input = new EditText(FingerPaint.this);
            LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
                    LinearLayout.LayoutParams.FILL_PARENT,
                    LinearLayout.LayoutParams.FILL_PARENT);
            input.setLayoutParams(lp);
            editalert.setView(input);
            editalert.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int whichButton) {

                String name= input.getText().toString();
                Bitmap bitmap = drawView.getDrawingCache();

             String path = Environment.getExternalStorageDirectory().getAbsolutePath(); 
                File file = new File("mnt/sdcard/"+name+".png");           
                try 
                {
                    if(!file.exists())
                {
                    file.createNewFile();
                }
                    FileOutputStream ostream = new FileOutputStream(file);
                    bitmap.compress(CompressFormat.PNG, 10, ostream);
                    ostream.close();
                    drawView.invalidate();   

                } 
                catch (Exception e) 
                {
                    e.printStackTrace();
                }finally
                {

                   drawView.setDrawingCacheEnabled(false);                           
                }
                }
            });

            editalert.show();       
        }
    });
}

public void resetButtons() {
    btnText.setSelected(false);
    btnClear.setSelected(false);
    btnSketch.setSelected(false);
    btnColor.setSelected(false);
    btnUndo.setSelected(false);
    btnRedo.setSelected(false);
}
    public class DrawingPanel extends View implements OnTouchListener {

        private int color;
        public int x, y;
        public DrawingPanel(Context context, int color) {
            super(context);
            this.color = color;
            setFocusable(true);
            setFocusableInTouchMode(true);

            this.setOnTouchListener(this);

            mBitmapPaint = new Paint(Paint.DITHER_FLAG);
            mPaint = new Paint();
            mPaint.setAntiAlias(true);
            mPaint.setDither(true);
            mPaint.setColor(color);
            mPaint.setStyle(Paint.Style.STROKE);
            mPaint.setStrokeJoin(Paint.Join.MITER);
            mPaint.setStrokeCap(Paint.Cap.ROUND);
            mPaint.setStrokeWidth(15);
            mPaint.setTextSize(30);
            //mPaint.setStyle(Style s);

            mPath = new Path();
            paths.add(new PathPoints(mPath, color, false));
            mCanvas = new Canvas();

        }

        public void colorChanged(int color) {
            this.color = color;
            mPaint.setColor(color);
        }

        @Override
        protected void onSizeChanged(int w, int h, int oldw, int oldh) {
            super.onSizeChanged(w, h, oldw, oldh);
            // mBitmap = AddReportItemActivity.mPhoto;
            //mBitmap = getIntent().getExtras().getParcelable(ChooseActivity.BITMAP);
             mBitmap = BitmapFactory.decodeResource(
                      getApplicationContext().getResources(),
                      R.drawable.images);

                   // targetImage.setImageBitmap(srcBitmapLocal);
            float xscale = (float) w / (float) mBitmap.getWidth();
            float yscale = (float) h / (float) mBitmap.getHeight();
            if (xscale > yscale) // make sure both dimensions fit (use the
                                    // smaller scale)
                xscale = yscale;
            float newx = (float) w * xscale;
            float newy = (float) h * xscale; // use the same scale for both
                                                // dimensions
            // if you want it centered on the display (black borders)
            mBitmap = Bitmap.createScaledBitmap(mBitmap, this.getWidth(),
                    this.getHeight(), true);
            // mCanvas = new Canvas(mBitmap);
        }

        @Override
        protected void onDraw(Canvas canvas) {
            canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);

            for (PathPoints p : paths) {
                mPaint.setColor(p.getColor());
                Log.v("", "Color code : " + p.getColor());
                if (p.isTextToDraw()) {
                    canvas.drawText(p.textToDraw, p.x, p.y, mPaint);
                } else {
                    canvas.drawPath(p.getPath(), mPaint);
                }
            }
        }

        private float mX, mY;
        private static final float TOUCH_TOLERANCE = 0;
        Point p=new Point();
        private void touch_start(float x, float y) {

            p.x=(int)x;
            p.y=(int)y;
            mPath.reset();
            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(y - mY);
        if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
            mPath.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2);
                mX = x;
                mY = y;
                int xx=Math.round(mX);
            int yy=Math.round(mY);

            }
        }

        private void touch_up() {

            mPath.lineTo(mX, mY);
            // commit the path to our offscreen
            mCanvas.drawPath(mPath, mPaint);
            // kill this so we don't double draw
            mPath = new Path();
            paths.add(new PathPoints(mPath, color, false));

        }

        private void drawText(int x, int y) {
            Log.v(TAG, "Here");
            Log.v(TAG, "X " + x + " Y " + y);
            this.x = x;
            this.y = y;



            paths.add(new PathPoints(color, textToDraw, true, x, y));
            // mCanvas.drawText(textToDraw, x, y, mPaint);
        }

        @Override
        public boolean onTouch(View arg0, MotionEvent event) {
            float x = event.getX();
            float y = event.getY();

            switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                if (!isTextModeOn) {
                touch_start(x, y);

                    invalidate();
                }
                break;
            case MotionEvent.ACTION_MOVE:
                if (!isTextModeOn) {
                    touch_move(x, y);
                    invalidate();
                }
                break;
            case MotionEvent.ACTION_UP:
                if (isTextModeOn) {
                    drawText((int) x, (int) y);
                    invalidate();
                } else {
                    touch_up();
                    invalidate();
                }
                break;
            }
            return true;
        }

        public void onClickUndo() {
            if (paths.size() > 0) {
                undonePaths.add(paths.remove(paths.size() - 1));
                invalidate();
            } else {

            }
            // toast the user
        }

        public void onClickRedo() {
            if (undonePaths.size() > 0) {
                paths.add(undonePaths.remove(undonePaths.size() - 1));
                invalidate();
            } else {

            }
            // toast the user
        }
    }

    public void colorChanged(int color) {
        // TODO Auto-generated method stub
        lastColor = color;
        drawView.colorChanged(lastColor);
    }

    class PathPoints {
        private Path path;
        // private Paint mPaint;
        private int color;
        private String textToDraw;
        private boolean isTextToDraw;
        private int x, y;

        public PathPoints(Path path, int color, boolean isTextToDraw) {
            this.path = path;
            this.color = color;
            this.isTextToDraw = isTextToDraw;
        }

        public PathPoints(int color, String textToDraw, boolean isTextToDraw,
                int x, int y) {
            this.color = color;
            this.textToDraw = textToDraw;
            this.isTextToDraw = isTextToDraw;
            this.x = x;
            this.y = y;
        }

        public Path getPath() {
            return path;
        }

        public void setPath(Path path) {
            this.path = path;
        }


        public int getColor() {
            return color;
        }

        public void setColor(int color) {
            this.color = color;
        }

        public String getTextToDraw() {
            return textToDraw;
        }

        public void setTextToDraw(String textToDraw) {
            this.textToDraw = textToDraw;
        }

        public boolean isTextToDraw() {
            return isTextToDraw;
        }

        public void setTextToDraw(boolean isTextToDraw) {
            this.isTextToDraw = isTextToDraw;
        }

        public int getX() {
            return x;
        }

        public void setX(int x) {
            this.x = x;
        }

        public int getY() {
            return y;
        }

        public void setY(int y) {
            this.y = y;
        }

    }
}
4

1 回答 1

-1

在你的 :

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
   }

在 canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint); 之前添加这些行

    canvas.save();
    canvas.drawColor(0xff000000);

希望它会有所帮助

于 2013-07-11T11:05:49.887 回答