2014-11-16 2 views
0

찍은 그림에 선을 그 으려하지만 선이 그려지지 않습니다. Canvas 사용 방법이 잘못 되었나요? 캔버스를 사용하는 방법을 잘 모르겠다 고 생각합니다. 어디서 수정해야합니까? 제발 가르쳐주세요.캔버스에 선이 그려지지 않습니다.

PhotoMemoActivity

public class PhotoMemoActivity extends Activity { 
    Uri _uri; 
    Canvas _canvas; 
    DrawCanvas _drawCanvas; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_photo_memo); 
     takePicture(); 
     _drawCanvas = new DrawCanvas(getApplicationContext()); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data){ 
     if(requestCode == 0){ 
      if(resultCode == RESULT_OK){ 
       ImageView imageView = (ImageView)findViewById(R.id.picture); 
       imageView.setImageURI(_uri); 
       Bitmap bitmap = ((BitmapDrawable)imageView.getDrawable()).getBitmap(); 
       Bitmap drawableBitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true); 
       _canvas = new Canvas(drawableBitmap); 
      } 
     } 
    } 

    public void takePicture(){ 
     String fileName = System.currentTimeMillis() + ".png"; 
     ContentValues values = new ContentValues(); 
     values.put(MediaStore.Images.Media.TITLE, fileName); 
     values.put(MediaStore.Images.Media.MIME_TYPE, "image/png"); 
     _uri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); 

     Intent intent = new Intent(); 
     intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE); 
     intent.putExtra(MediaStore.EXTRA_OUTPUT, _uri); 
     startActivityForResult(intent, 0); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.photo_memo, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     int id = item.getItemId(); 
     if (id == R.id.action_settings) { 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event){ 
     float firstX=0, firstY=0, lastX, lastY, x, y; 

     switch (event.getAction()){ 
      case MotionEvent.ACTION_DOWN: 
       firstX = event.getX(); 
       firstY = event.getY(); 
       break; 
      case MotionEvent.ACTION_MOVE: 
       lastX = event.getX(); 
       lastY = event.getY(); 
       _drawCanvas.draw(firstX, firstY, lastX, lastY, _canvas); 
       break; 
      default: 
       break; 
     } 
     return true; 
    } 

} 

DrawCanvas

public class DrawCanvas extends ImageView { 

    public DrawCanvas(Context context){ 
     super(context); 
    } 

    public void draw(float firstX, float firstY, float lastX, float lastY, Canvas canvas){ 
     Paint p = new Paint(); 
     p.setStyle(Paint.Style.FILL); 
     p.setColor(Color.GREEN); 
     p.setStrokeWidth(10); 
     canvas.drawLine(firstX, firstY, lastX, lastY, p); 
     invalidate(); 
    } 
} 

답변

1

당신은 당신이 당신의 아이디어를 결합 할 필요가 거의 다 왔어. 촬영 된 그림 그리기 및 그림의 라인 상단 그림 그리기를 처리하는 단일보기를 만듭니다.

클래스 "DrawCanvas"만 사용하십시오. 뷰에 대한 문서와 여기에서 수행하려는 사용자 정의 뷰를 만드는 일반적인 개념을 살펴 보겠습니다. 뷰에는 이미 "onDraw"호출이 있으므로이를 무시하고 직접 터치 처리를 추가하십시오.

public class DrawCanvas extends ImageView { 

private Bitmap curBitmap; 
private Paint paint; 
private Paint pathPaint; 
private Path curPath; 

public DrawCanvas(Context context){ 
    super(context); 
} 

private void initialize() { 

pathPaint = new Paint(); 
pathPaint.setAntiAlias(true); 
pathPaint.setStrokeWidth(2); 
pathPaint.setStrokeSize(14); 
pathPaint.setColor(Color.BLACK); 

curPath = new Path(); 
paint = new Paint(); 
paint.setAntiAlias(true); 
paint.setFilterBitmap(true); 
paint.setDither(true); 

//create the bitmap. 
curBitmap = Bitmap.createBitmap(getWidth(), getHeight(), ARGB_8888); 


} 

public void onDraw(Canvas canvas) { 
    //draw bitmap first. 
    canvas.drawBitmap(bitmap, x, y, paint); 
    //draw the line 
    canvas.drawPath(curPath, pathPaint); 
} 

@Override 
public boolean onTouchEvent(MotionEvent event){ 


    switch (event.getAction()){ 
     case MotionEvent.ACTION_DOWN: 
      //move to the current path 
      curPath.moveTo(event.getX(), event.getY()); 
      break; 
     case MotionEvent.ACTION_MOVE: 
      curPath.lineTo(event.getX(), event.getY()); 
      break; 
     case MotionEvent.ACTION_UP: 
       //do something when the person lets go. 
     default: 
      break; 
    } 
    // redraw the view. 
    invalidate(); 
    return true; 
} 


    public void setBitmapToDraw(Bitmap bitmap) { 
    this.curBitmap = bitmap; 
    invalidate(); 
    } 

} 

다음 활동. 보기에서 비트 맵을 설정하기 만하면됩니다.

...other code.... 
    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data){ 
     if(requestCode == 0){ 
      if(resultCode == RESULT_OK){ 
       ImageView imageView = (ImageView)findViewById(R.id.picture); 
       imageView.setImageURI(_uri); 
       Bitmap bitmap = ((BitmapDrawable)imageView.getDrawable()).getBitmap(); 
       Bitmap drawableBitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true); 
       drawView.setBitmapToDraw(drawableBitmap); 
      } 
     } 
    } 

보기 다음 링크 :

Android Bitmap

Android Path

Android

Android Canvas

+0

당신을 감사합니다! 그림 사용 방법을 찾은 것을 기쁘게 생각합니다. 친절에 감사드립니다. – tarofess

+0

예! 문제가 생기면 코드가 꽤 거칠고 맨손의 뼈다. –

+0

OK! 정말 감사드립니다! – tarofess

관련 문제