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 に答える