2013-07-11 92 views
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; 
     } 

    } 
} 

回答

-1

在:

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

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

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

希望這將有助於

+0

沒有它不工作 – user1593373