2012-10-31 3 views
0

내가 그리려고하는 CustomImage (확장보기)가있는 활동이 있는데, 나는 그 줄을 볼 수 있지만 내 touchUp에서는 사라집니다. 는이 같은 페인트를 설정합니다그리기가 진행되지 않습니다.보기

paint = (CustomImage) findViewById(R.id.paint); 
mPaint = new Paint(); 
mPaint.setAntiAlias(true); 
mPaint.setDither(true); 
mPaint.setColor(0xFF000000); 
mPaint.setStyle(Paint.Style.STROKE); 
mPaint.setStrokeJoin(Paint.Join.ROUND); 
mPaint.setStrokeCap(Paint.Cap.ROUND); 
mPaint.setXfermode(null); 
mPaint.setAlpha(0xFF); 
mPaint.setMaskFilter(null); 
mPaint.setStrokeWidth(50); 
paint.setPaint(mPaint); 

이 내 CustomImage 클래스입니다 :

public class CustomImage extends View { 

private Bitmap bitmap; 

public Context context; 

Paint paint = new Paint(); 

private Canvas canvas = new Canvas(); 

private Path mPath = new Path(); 

private float mX, mY; 

private static final float TOUCH_TOLERANCE = 4; 

private float screenDensity; 

int height, width; 

public CustomImage(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    init(context); 
} 

public CustomImage(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    init(context); 
} 

public CustomImage(Context context) { 
    super(context); 
    init(context); 
} 

private void init(Context context) { 
    this.context = context; 
} 

public void setImg(Context context, Canvas canvas, Bitmap bitmap, int width, int height) { 
    this.bitmap = bitmap; 
    canvas.drawBitmap(bitmap, 0, 0, null); 
} 

public void setPaint(Paint paint) { 
    this.paint = paint; 
} 
public void getBitmap(Bitmap bitmap) { 
    this.bitmap = bitmap; 
} 

@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    canvas.drawBitmap(bitmap, 0, 0, null); 
    canvas.drawPath(mPath, paint); 

} 

private void touch_start(float x, float 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; 
    } 
} 

private void touch_up() { 
    mPath.lineTo(mX, mY); 
    mPath.moveTo(mX, mY); 
    canvas.drawPath(mPath, paint); 
    mPath.reset(); 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    float x = event.getX(); 
    float y = event.getY(); 
    switch (event.getAction()) { 
    case MotionEvent.ACTION_DOWN: 
     touch_start(x, y); 

     invalidate(); 
     break; 
    case MotionEvent.ACTION_MOVE: 
     touch_move(x, y); 
     invalidate(); 
     break; 
    case MotionEvent.ACTION_UP: 
     touch_up(); 
     invalidate(); 
     break; 
    } 
    return true; 
} 
} 

먼저 내가보기 상에 배경 이미지를 설정합니다. 그 그림을 그릴 수 있어야합니다. 앱에서 줄을 그으나 터치 업하면 사라집니다. 어떻게 피할 수 있습니까?

+0

에 저장됩니다); touch_up() 메소드에서. –

+0

처럼 하나의 추첨을 계속할 것입니다.하지만 다른 것을 그려 내기 위해 다시 누르면 첫 번째 무언가가 사라집니다. 내 코드를보고 있었는데, Canvas canvas = new Canvas();와 같이 캔버스 캔버스 = 새로운 캔버스 (비트 맵); 비트 맵에 기록합니다. 그러나 그것은 추락합니다. Logcat은 다음과 같이 말합니다 : 불변의 비트 맵이 Canvas 생성자에 전달되었습니다. 이것을 극복하는 방법에 대한 이상이 있습니까? –

답변

0

비트 맵을 변경 가능하게 만든 다음 캔버스 캔버스 = 새로운 캔버스 (비트 맵)를 적용했습니다. 내가 가변 비트 맵 만든 방법 : 당신이 캔버스와 비트 맵을 사용할 수 있습니다

public void setBitmap(Bitmap bitmap, Bitmap.Config targetConfig) throws Exception { 
    System.out.println("CustomImage.setBitmap()"); 
    File file = new File("/mnt/sdcard/sample/temp.txt"); 
    file.getParentFile().mkdirs(); 
    randomAccessFile = new RandomAccessFile(file, "rw"); 
    int bWidth = bitmap.getWidth(); 
    int bHeight = bitmap.getHeight(); 
    FileChannel channel = randomAccessFile.getChannel(); 
    MappedByteBuffer map = channel.map(MapMode.READ_WRITE, 0, bWidth*bHeight*4); 
    bitmap.copyPixelsToBuffer(map); 
    bitmap.recycle(); 
    this.bitmap = Bitmap.createBitmap(bWidth, bHeight, targetConfig); 
    map.position(0); 
    this.bitmap.copyPixelsFromBuffer(map); 
    channel.close(); 
    randomAccessFile.close(); 
    //  this.bitmap = bitmap; 


    // canvas = new Canvas(); 
} 
0

을; onDraw는 경우

mBitmap = Bitmap.createBitmap(mPictureWidth, mPictureHeight, 
      Bitmap.Config.ARGB_8888); 
    mCanvas = new Canvas(mBitmap); 
    mCanvas.save(); 

: 사용자가 만든 캔버스에

@Override 
protected void onDraw(Canvas canvas) { 
    mCanvas.restore(); 
    mCanvas.drawPath(path, paint); 
    mCanvas.save(); 
    if (mBitmap != null) 
     canvas.drawBitmap(mBitmap, 0, 0, null); 
} 

첫 무승부, 다음 뷰의 캔버스에 그리기, 기록은 는 (당신의 코드 mPath.reset을 확인 비트 맵

관련 문제