2014-09-03 1 views
0

캔버스 (backgroundBitmap)에 변경되지 않고 유지하려는 비트 맵 하나와 backgroundBitmap 위에 드래그 할 수있는 다른 작은 비트 맵 (draggableBitmap)이 있습니다. (그리고 나는 z 축 에서처럼 "위"를 의미합니다).Android 그래픽 - 비트 맵을 드래그하는 동안 캔버스 지우기

제 생각에는 각 ACTION_MOVE로 배경을 다시 그리는 것입니다. 단색으로이 작업을 수행하면 완벽하게 작동합니다. color 대신 backgroundBitmap을 다시 그릴 때 backgroundBitmap은 계속 표시되지만 draggableBitmap은 끌린 경로를 따라 반복됩니다. 단색이 이미지를 "제거"하고 비트 맵이 작동하지 않는 이유는 무엇입니까?

편집 : 많은 도움을 주신 Steve K에게 많은 감사를드립니다. 지금까지 진행 상황을 반영하도록 아래 코드를 업데이트했습니다. 이 시점에서 유일한 문제는 끌기가 시작된 후 이미지가 완전히 검게 변하는 것입니다. 이 배경 비트 맵을 변경할 수있는 설정과 관련이 있습니까? 나는 그것없이 mutability error를 얻고 있었다.

package com.example.drawing; 

import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.Path; 
import android.graphics.PorterDuff; 
import android.util.AttributeSet; 
import android.view.MotionEvent; 
import android.view.View; 

public class DrawingView extends View { 
    // drawing and canvas paint 
    private Paint canvasPaint; 
    // canvas 
    private Canvas drawCanvas; 
    // canvas bitmap 
    private Bitmap backgroundBitmap, draggableBitmap; 

    public DrawingView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     setupDrawing(); 
    } 

    private void setupDrawing() { 
     canvasPaint = new Paint(); 
     canvasPaint.setColor(Color.TRANSPARENT); 
    } 

    @Override 
    protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
     super.onSizeChanged(w, h, oldw, oldh); 

     BitmapFactory.Options opt1 = new BitmapFactory.Options(); 
     opt1.inMutable = true; 
     opt1.inSampleSize = 4; 

     BitmapFactory.Options opt2 = new BitmapFactory.Options(); 
     opt2.inMutable = true; 

     backgroundBitmap = BitmapFactory.decodeFile("/storage/emulated/0/DCIM/Camera/20140901_223343.jpg", opt1); 

     draggableBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.draggable_image, opt2); 

     drawCanvas = new Canvas(backgroundBitmap); 
    } 

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

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     float touchX = event.getX(); 
     float touchY = event.getY(); 

     switch (event.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
       // Nothing here 
       break; 
      case MotionEvent.ACTION_MOVE: 
       drawCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); 
       drawCanvas.drawBitmap(backgroundBitmap, 0, 0, null); 
       drawCanvas.drawBitmap(draggableBitmap, touchX, touchY, null); 
       break; 
      case MotionEvent.ACTION_UP: 
       // Nothing here 
       break; 
      default: 
       return false; 
     } 

     invalidate(); 
     return true; 
    } 
} 

답변

0

예, 캔버스를 만들 때 변경 가능한 비트 맵이 있어야합니다. backgroundBitmap을 대상으로 초기화 한 캔버스에 backgroundBitmap을 그릴 때 backgroundBitmap이 그려 지지만 중요한 점은 대상 그리기 화면이므로 backgroundBitmap에 포함 된 글자 그대로 (볼 수있는 그림이 캔버스에 그려지는 모든 것의 합계), 다시 그리면 아무 일도 일어나지 않습니다. backgroundBitmap으로 캔버스를 초기화하면 캔버스 CHANGED backgroundBitmap에 그린 모든 것. 스프린트가 아닌 깨끗한 서페이스가 필요합니다.

1

색상에는 경계가 정의되어 있지 않으므로 모든 픽셀에 글을 써서 캔버스를 지 웁니다. 떠 다니는 비트 맵은 그렇지 않습니다 - 단지 그것이있는 곳에서만 다시 그려집니다. 전체 캔버스를 다시 그려야하고, 먼저 색상으로 지운 다음 그려야합니다.

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    float touchX = event.getX(); 
    float touchY = event.getY(); 

    switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      // Nothing here 
      break; 
     case MotionEvent.ACTION_MOVE: 
      drawCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR) 
      drawCanvas.drawBitmap(backgroundBitmap, 0, 0, null); 
      drawCanvas.drawBitmap(draggableBitmap, touchX, touchY, null); 
      break; 
     case MotionEvent.ACTION_UP: 
      // Nothing here 
      break; 
     default: 
      return false; 
    } 

    invalidate(); 
    return true; 
} 
+0

죄송합니다. 마지막 코멘트를 삭제했습니다. .drawBitmap의 마지막 인자가'Paint' 객체 일 필요가있는 것처럼 보입니다. 나는 색상을'Color.TRANSPARENT'으로 설정하고 그것을 대신 사용했지만 변경을 시도하지 않았습니다. – user2864874

+0

좋아, 잠깐만 -'lastX','lastY' 비트 맵에 대해'TRANSPARENT'를 색으로 설정하면 화면의 0,0 구석에 잠긴 더 작은 비트 맵 사본이 있습니다. 색상을 '투명'으로 설정하면 사라집니다. 귀하의 제안이 작동하지만 투명 비트 맵이 움직이지 않는 것처럼 보입니다. logcat의 Sysout은 lastX/Y 값을 올바르게 업데이트하는 것을 보여줍니다. – user2864874

+0

이것은 여전히'draggableBitmap'의 흔적을 남깁니다. 모서리에있는 비트 맵이가는 한 원래 코드는 괜찮 았습니다. – user2864874

0

제 3의 비트 맵이 추가되었습니다. 내가 고백하는 동안 완전히이 작동하는 방식을 이해하지 못했지만 다른 모든 그림이 캔버스에 적용된 비트 맵의 ​​필요성에 대해 읽은 것을 기억했습니다.

drawCanvascanvasBitmap으로 구성되고, drawCanvasbgBitmapdraggableBitmap을 다시 그리기 위해 사용됩니다. 나는 원래의 코드에서 내 오류가 있다고 생각하고있다. canvasBitmap이 그 위에 그려 내려고했던 비트 맵을 사용하여 구성되었다는 것인가?

package com.example.drawing; 

import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.util.AttributeSet; 
import android.view.MotionEvent; 
import android.view.View; 

public class DrawingView extends View { 
    // drawing and canvas paint 
    private Paint canvasPaint; 
    // canvas 
    private Canvas drawCanvas; 
    // canvas bitmap 
    private Bitmap canvasBitmap, draggableBitmap, bgBitmap; 

    public DrawingView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     setupDrawing(); 
    } 

    private void setupDrawing() { 
     canvasPaint = new Paint(); 
     canvasPaint.setColor(Color.TRANSPARENT); 
    } 

    @Override 
    protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
     super.onSizeChanged(w, h, oldw, oldh); 

     BitmapFactory.Options opt1 = new BitmapFactory.Options(); 
     opt1.inMutable = true; 
     opt1.inSampleSize = 4; 

     BitmapFactory.Options opt2 = new BitmapFactory.Options(); 
     opt2.inMutable = true; 

     bgBitmap = BitmapFactory.decodeFile("/storage/emulated/0/DCIM/Camera/20140901_223343.jpg", opt1); 

     draggableBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.draggable_image, opt2); 

     canvasBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); 
     drawCanvas = new Canvas(canvasBitmap); 

     drawCanvas.drawBitmap(bgBitmap, 0, 0, null); 
    } 

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

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     float touchX = event.getX(); 
     float touchY = event.getY(); 

     switch (event.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
       // Nothing here 
       break; 
      case MotionEvent.ACTION_MOVE: 
       drawCanvas.drawBitmap(bgBitmap, 0, 0, null); 
       drawCanvas.drawBitmap(draggableBitmap, touchX, touchY, null); 
       break; 
      case MotionEvent.ACTION_UP: 
       // Nothing here 
       break; 
      default: 
       return false; 
     } 

     invalidate(); 
     return true; 
    } 
} 
관련 문제