터치 업 이벤트 후 비트 맵의 Android 그리기가 사라집니다.

Ahmed

장치에서 이미지를 가져와 캔버스에 추가 한 다음 브러시와 지우개 (예 : snapchat 아이디어)를 사용하여 그리기를 시작하는 응용 프로그램을 구현하려고합니다. 드로잉 앱을 기본으로 사용했습니다.

http://code.tutsplus.com/series/create-a-drawing-app-on-android--cms-704

내 문제는 비트 맵에 그릴 때 그리기 시작하지만 완료하고 터치하면 그림이 사라진다는 것입니다.

이것은 문제에 대한 비디오입니다

https://vid.me/rgnF (음소거를 시도하면 약간의 소음이 있습니다 :))

어떤 도움을 주시면 감사하겠습니다. 감사합니다

public class DrawingView extends View {



    //drawing path
    private Path drawPath;
    //drawing and canvas paint
    private Paint drawPaint, canvasPaint;
    //initial color
    private int paintColor = 0xFF660000;
    //canvas
    private Canvas drawCanvas;
    //canvas bitmap
    public Bitmap canvasBitmap;
    //brush sizes
    private float brushSize, lastBrushSize;
    //erase flag
    private boolean erase=false;

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

    //setup drawing
private void setupDrawing(){

    //prepare for drawing and setup paint stroke properties
    brushSize = getResources().getInteger(R.integer.medium_size);
    lastBrushSize = brushSize;
    drawPath = new Path();
    drawPaint = new Paint();
    drawPaint.setColor(paintColor);
    drawPaint.setAntiAlias(true);
    drawPaint.setStrokeWidth(brushSize);
    drawPaint.setStyle(Paint.Style.STROKE);
    drawPaint.setStrokeJoin(Paint.Join.ROUND);
    drawPaint.setStrokeCap(Paint.Cap.ROUND);
    canvasPaint = new Paint(Paint.DITHER_FLAG);
}

//size assigned to view
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);
    canvasBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
        drawCanvas = new Canvas(canvasBitmap);


}

//draw the view - will be called after touch event
@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);



    canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint);
    canvas.drawPath(drawPath, drawPaint);

}

@Override
public boolean onTouchEvent(MotionEvent event) {
    float touchX = event.getX();
    float touchY = event.getY();
    //respond to down, move and up events
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            drawPath.moveTo(touchX, touchY);
            break;
        case MotionEvent.ACTION_MOVE:
            drawPath.lineTo(touchX, touchY);
            break;
        case MotionEvent.ACTION_UP:
            drawPath.lineTo(touchX, touchY);
            drawCanvas.drawPath(drawPath, drawPaint);
        drawPath.reset();

            break;
        default:
            return false;
    }
    //redraw
    invalidate();
    return true;

}

//update color
public void setColor(String newColor){
    invalidate();
    paintColor = Color.parseColor(newColor);
    drawPaint.setColor(paintColor);
}

//set brush size
public void setBrushSize(float newSize){
    float pixelAmount = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
            newSize, getResources().getDisplayMetrics());
    brushSize=pixelAmount;
    drawPaint.setStrokeWidth(brushSize);
}

//get and set last brush size
public void setLastBrushSize(float lastSize){
    lastBrushSize=lastSize;
}
public float getLastBrushSize(){
    return lastBrushSize;
}

//set erase true or false
public void setErase(boolean isErase){
    erase=isErase;
    if(erase) drawPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
    else drawPaint.setXfermode(null);
}

//start new drawing
public void startNew(){
    drawCanvas.drawColor(0, PorterDuff.Mode.CLEAR);
    invalidate();
}

}

public class MainActivity extends Activity implements OnClickListener {

//custom drawing view
private DrawingView drawView;
//buttons
private ImageButton currPaint, drawBtn, eraseBtn, newBtn, saveBtn;
//sizes
private float smallBrush, mediumBrush, largeBrush;
Button mBtnPick;
int mWidth;
int mHeight;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mWidth = mHeight = 0;
    //get drawing view
    drawView = (DrawingView)findViewById(R.id.drawing);

    //get the palette and first color button
    LinearLayout paintLayout = (LinearLayout)findViewById(R.id.paint_colors);
    currPaint = (ImageButton)paintLayout.getChildAt(0);
    currPaint.setImageDrawable(getResources().getDrawable(R.drawable.paint_pressed));

    //sizes from dimensions
    smallBrush = getResources().getInteger(R.integer.small_size);
    mediumBrush = getResources().getInteger(R.integer.medium_size);
    largeBrush = getResources().getInteger(R.integer.large_size);

    //draw button
    drawBtn = (ImageButton)findViewById(R.id.draw_btn);
    drawBtn.setOnClickListener(this);

    //set initial size
    drawView.setBrushSize(mediumBrush);

    //erase button
    eraseBtn = (ImageButton)findViewById(R.id.erase_btn);
    eraseBtn.setOnClickListener(this);

    //new button
    newBtn = (ImageButton)findViewById(R.id.new_btn);
    newBtn.setOnClickListener(this);

    //save button
    saveBtn = (ImageButton)findViewById(R.id.save_btn);
    saveBtn.setOnClickListener(this);
    // Getting reference to Button "Pick an Image"
    mBtnPick = (Button) findViewById(R.id.button);

    // Setting OnClickListener for the button
    mBtnPick.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            Intent i = new Intent();
            i.setType("image/*");
            i.setAction(Intent.ACTION_GET_CONTENT);

            Intent customChooserIntent = Intent.createChooser(i, "Pick an image");
            startActivityForResult(customChooserIntent, 10);
        }
    });

    if(savedInstanceState!=null){
        mWidth = savedInstanceState.getInt("width");
        mHeight = savedInstanceState.getInt("height");
        Bitmap bitmap = savedInstanceState.getParcelable("bitmap");
        if(bitmap!=null){
            drawView.canvasBitmap=bitmap;
        }
    }
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
}

//user clicked paint
public void paintClicked(View view){
    //use chosen color

    //set erase false
    drawView.setErase(false);
    drawView.setBrushSize(drawView.getLastBrushSize());

    if(view!=currPaint){
        ImageButton imgView = (ImageButton)view;
        String color = view.getTag().toString();
        drawView.setColor(color);
        //update ui
        imgView.setImageDrawable(getResources().getDrawable(R.drawable.paint_pressed));
        currPaint.setImageDrawable(getResources().getDrawable(R.drawable.paint));
        currPaint=(ImageButton)view;
    }
}

@Override
public void onClick(View view){

    if(view.getId()==R.id.draw_btn){
        //draw button clicked
        final Dialog brushDialog = new Dialog(this);
        brushDialog.setTitle("Brush size:");
        brushDialog.setContentView(R.layout.brush_chooser);
        //listen for clicks on size buttons
        ImageButton smallBtn = (ImageButton)brushDialog.findViewById(R.id.small_brush);
        smallBtn.setOnClickListener(new OnClickListener(){
            @Override
            public void onClick(View v) {
                drawView.setErase(false);
                drawView.setBrushSize(smallBrush);
                drawView.setLastBrushSize(smallBrush);
                brushDialog.dismiss();
            }
        });
        ImageButton mediumBtn = (ImageButton)brushDialog.findViewById(R.id.medium_brush);
        mediumBtn.setOnClickListener(new OnClickListener(){
            @Override
            public void onClick(View v) {
                drawView.setErase(false);
                drawView.setBrushSize(mediumBrush);
                drawView.setLastBrushSize(mediumBrush);
                brushDialog.dismiss();
            }
        });
        ImageButton largeBtn = (ImageButton)brushDialog.findViewById(R.id.large_brush);
        largeBtn.setOnClickListener(new OnClickListener(){
            @Override
            public void onClick(View v) {
                drawView.setErase(false);
                drawView.setBrushSize(largeBrush);
                drawView.setLastBrushSize(largeBrush);
                brushDialog.dismiss();
            }
        });
        //show and wait for user interaction
        brushDialog.show();
    }
    else if(view.getId()==R.id.erase_btn){
        //switch to erase - choose size
        final Dialog brushDialog = new Dialog(this);
        brushDialog.setTitle("Eraser size:");
        brushDialog.setContentView(R.layout.brush_chooser);
        //size buttons
        ImageButton smallBtn = (ImageButton)brushDialog.findViewById(R.id.small_brush);
        smallBtn.setOnClickListener(new OnClickListener(){
            @Override
            public void onClick(View v) {
                drawView.setErase(true);
                drawView.setBrushSize(smallBrush);
                brushDialog.dismiss();
            }
        });
        ImageButton mediumBtn = (ImageButton)brushDialog.findViewById(R.id.medium_brush);
        mediumBtn.setOnClickListener(new OnClickListener(){
            @Override
            public void onClick(View v) {
                drawView.setErase(true);
                drawView.setBrushSize(mediumBrush);
                brushDialog.dismiss();
            }
        });
        ImageButton largeBtn = (ImageButton)brushDialog.findViewById(R.id.large_brush);
        largeBtn.setOnClickListener(new OnClickListener(){
            @Override
            public void onClick(View v) {
                drawView.setErase(true);
                drawView.setBrushSize(largeBrush);
                brushDialog.dismiss();
            }
        });
        brushDialog.show();
    }
    else if(view.getId()==R.id.new_btn){
        //new button
    AlertDialog.Builder newDialog = new AlertDialog.Builder(this);
        newDialog.setTitle("New drawing");
        newDialog.setMessage("Start new drawing (you will lose the current drawing)?");
        newDialog.setPositiveButton("Yes", new DialogInterface.OnClickListener(){
            public void onClick(DialogInterface dialog, int which){
                drawView.startNew();
                dialog.dismiss();
            }
        });
        newDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener(){
            public void onClick(DialogInterface dialog, int which){
                dialog.cancel();
            }
        });

        newDialog.show();


    }
    else if(view.getId()==R.id.save_btn){
        //save drawing
        AlertDialog.Builder saveDialog = new AlertDialog.Builder(this);
        saveDialog.setTitle("Save drawing");
        saveDialog.setMessage("Save drawing to device Gallery?");
        saveDialog.setPositiveButton("Yes", new DialogInterface.OnClickListener(){
            public void onClick(DialogInterface dialog, int which){
                //save drawing
                drawView.setDrawingCacheEnabled(true);
                //attempt to save
                String imgSaved = MediaStore.Images.Media.insertImage(
                        getContentResolver(), drawView.getDrawingCache(),
                        UUID.randomUUID().toString()+".png", "drawing");
                //feedback
                if(imgSaved!=null){
                    Toast savedToast = Toast.makeText(getApplicationContext(),
                            "Drawing saved to Gallery!", Toast.LENGTH_SHORT);
                    savedToast.show();
                }
                else{
                    Toast unsavedToast = Toast.makeText(getApplicationContext(),
                            "Oops! Image could not be saved.", Toast.LENGTH_SHORT);
                    unsavedToast.show();
                }
                drawView.destroyDrawingCache();
            }
        });
        saveDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener(){
            public void onClick(DialogInterface dialog, int which){
                dialog.cancel();
            }
        });
        saveDialog.show();
    }
}
// Courtesy : developer.android.com/training/displaying-bitmaps/load-bitmap.html
public static int calculateInSampleSize(

        BitmapFactory.Options options, int reqWidth, int reqHeight) {
    // Raw height and width of image
    final int height = options.outHeight;
    final int width = options.outWidth;
    int inSampleSize = 1;

    if (height > reqHeight || width > reqWidth) {

        // Calculate ratios of height and width to requested height and width
        final int heightRatio = Math.round((float) height / (float) reqHeight);
        final int widthRatio = Math.round((float) width / (float) reqWidth);

        // Choose the smallest ratio as inSampleSize value, this will guarantee
        // a final image with both dimensions larger than or equal to the
        // requested height and width.
        inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
    }

    return inSampleSize;
}


private Bitmap getBitmapFromUri(Uri data){
    Bitmap bitmap = null;

    // Starting fetch image from file
    InputStream is=null;
    try {

        is = getContentResolver().openInputStream(data);

        // First decode with inJustDecodeBounds=true to check dimensions
        final BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;

        // BitmapFactory.decodeFile(path, options);
        BitmapFactory.decodeStream(is, null, options);

        // Calculate inSampleSize
        options.inSampleSize = calculateInSampleSize(options, mWidth, mHeight);

        // Decode bitmap with inSampleSize set
        options.inJustDecodeBounds = false;

        is = getContentResolver().openInputStream(data);

        bitmap = BitmapFactory.decodeStream(is,null,options);


        if(bitmap==null){
            Toast.makeText(getBaseContext(), "Image is not Loaded",Toast.LENGTH_SHORT).show();
            return null;
        }

        is.close();
    }catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }catch(NullPointerException e){
        e.printStackTrace();
    }
    return bitmap;
}


@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
    // TODO Auto-generated method stub
    super.onActivityResult(requestCode, resultCode, intent);
    if (requestCode == 10 && resultCode == RESULT_OK && null != intent) {
        Uri data = intent.getData();
        Bitmap bitmap = getBitmapFromUri(data);
        if(bitmap!=null){
            drawView.canvasBitmap=bitmap;
        }
    }
}


@Override
public void onWindowFocusChanged(boolean hasFocus) {
    // TODO Auto-generated method stub
    super.onWindowFocusChanged(hasFocus);
    mWidth = drawView.getWidth();
    mHeight = drawView.getHeight();
}

@Override
protected void onSaveInstanceState(Bundle outState) {

    outState.putInt("width", mWidth);
    outState.putInt("height", mHeight);
    if(drawView.canvasBitmap!=null){
        outState.putParcelable("bitmap", drawView.canvasBitmap);
    }

    super.onSaveInstanceState(outState);

}

}

Ahmed

마지막으로 DrawingView 클래스에 다음 메서드를 추가하여 문제를 해결했습니다.

public void setPicture (Bitmap bitmap) {
    setBackgroundDrawable(new BitmapDrawable(bitmap));
}

그런 다음 모든 줄을 다음으로 대체 drawView.canvasBitmap=bitmap;했습니다.drawView.setPicture(bitmap);

그리고 모든 것이 잘 작동합니다 :)

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

캔버스 Android에서 터치 이벤트 후 임의의 위치에 직사각형 그리기

분류에서Dev

터치 이벤트 후 키비 캔버스 다시 그리기

분류에서Dev

터치 할 때마다 ImageView에 비트 맵 그리기-Android

분류에서Dev

Android의 터치 이벤트에서 이미지보기가 이동 한 후 알파 애니메이션이 이상하게 작동합니다.

분류에서Dev

홈 스트리밍을 위해 기가비트 스위치를 구입하거나 기가비트 라우터로 업그레이드해야합니까?

분류에서Dev

PopOver의 iOS TableViewController가 tableview를 터치 한 후 사라집니다.

분류에서Dev

편집 셀의 AG 그리드 터치 이벤트

분류에서Dev

Vue.js-Vue에서 데이터베이스의 값이 변경된 후 값이 업데이트되지 않거나 사라집니다.

분류에서Dev

클릭 이벤트 후 gridview에 업데이트 데이터가 표시되지 않습니다.

분류에서Dev

Android의 longBlob 데이터에서 비트 맵 만들기

분류에서Dev

Android의 longBlob 데이터에서 비트 맵 만들기

분류에서Dev

CommandLink에서 업데이트 한 후 Primefaces 데이터 테이블이 사라집니다.

분류에서Dev

SwiftUI : 시트를 닫은 후 목록 데이터가 사라집니다.

분류에서Dev

10.10 업그레이드 후 Marvell 어댑터의 1TB SATA HDrive가 사라집니다-이유가 무엇입니까?

분류에서Dev

10.10 업그레이드 후 Marvell 어댑터의 1TB SATA HDrive가 사라집니다-이유가 무엇입니까?

분류에서Dev

eclipse / matlab의 텍스트 편집기가 12.04로 업그레이드 한 후 가끔 초점을 잃습니다.

분류에서Dev

eclipse / matlab의 텍스트 편집기가 12.04로 업그레이드 한 후 가끔 초점을 잃습니다.

분류에서Dev

사용자 정의보기가 비트 맵을 그리지 않습니다.

분류에서Dev

Highcharts로 히트 맵 크기 조정 후 데이터 레이블 위치 업데이트

분류에서Dev

Android는 ImageView에서 비트 맵의 위치를 얻습니다.

분류에서Dev

Android의 터치 이벤트 SDL2

분류에서Dev

Android : 어댑터의 터치 이벤트에서 GridView의 이미지 업데이트

분류에서Dev

Android 앱의 비동기 작업에서 비트 맵을 반환하는 방법

분류에서Dev

Android : 터치 이벤트 보내기

분류에서Dev

MODx Revo 2.2.15-pl을 MODx Revo 2.3.0-pl로 업데이트 한 후 관리자 패널의 오른쪽이 사라집니다.

분류에서Dev

Android 서비스가 터치 이벤트 수신

분류에서Dev

업데이트 설치 후 컴퓨터가 부팅되지 않습니다!

분류에서Dev

캔버스 이미지 비트 맵에 원터치 그리기

분류에서Dev

Android Java : 비트 맵에 폴리 라인 그리기

Related 관련 기사

  1. 1

    캔버스 Android에서 터치 이벤트 후 임의의 위치에 직사각형 그리기

  2. 2

    터치 이벤트 후 키비 캔버스 다시 그리기

  3. 3

    터치 할 때마다 ImageView에 비트 맵 그리기-Android

  4. 4

    Android의 터치 이벤트에서 이미지보기가 이동 한 후 알파 애니메이션이 이상하게 작동합니다.

  5. 5

    홈 스트리밍을 위해 기가비트 스위치를 구입하거나 기가비트 라우터로 업그레이드해야합니까?

  6. 6

    PopOver의 iOS TableViewController가 tableview를 터치 한 후 사라집니다.

  7. 7

    편집 셀의 AG 그리드 터치 이벤트

  8. 8

    Vue.js-Vue에서 데이터베이스의 값이 변경된 후 값이 업데이트되지 않거나 사라집니다.

  9. 9

    클릭 이벤트 후 gridview에 업데이트 데이터가 표시되지 않습니다.

  10. 10

    Android의 longBlob 데이터에서 비트 맵 만들기

  11. 11

    Android의 longBlob 데이터에서 비트 맵 만들기

  12. 12

    CommandLink에서 업데이트 한 후 Primefaces 데이터 테이블이 사라집니다.

  13. 13

    SwiftUI : 시트를 닫은 후 목록 데이터가 사라집니다.

  14. 14

    10.10 업그레이드 후 Marvell 어댑터의 1TB SATA HDrive가 사라집니다-이유가 무엇입니까?

  15. 15

    10.10 업그레이드 후 Marvell 어댑터의 1TB SATA HDrive가 사라집니다-이유가 무엇입니까?

  16. 16

    eclipse / matlab의 텍스트 편집기가 12.04로 업그레이드 한 후 가끔 초점을 잃습니다.

  17. 17

    eclipse / matlab의 텍스트 편집기가 12.04로 업그레이드 한 후 가끔 초점을 잃습니다.

  18. 18

    사용자 정의보기가 비트 맵을 그리지 않습니다.

  19. 19

    Highcharts로 히트 맵 크기 조정 후 데이터 레이블 위치 업데이트

  20. 20

    Android는 ImageView에서 비트 맵의 위치를 얻습니다.

  21. 21

    Android의 터치 이벤트 SDL2

  22. 22

    Android : 어댑터의 터치 이벤트에서 GridView의 이미지 업데이트

  23. 23

    Android 앱의 비동기 작업에서 비트 맵을 반환하는 방법

  24. 24

    Android : 터치 이벤트 보내기

  25. 25

    MODx Revo 2.2.15-pl을 MODx Revo 2.3.0-pl로 업데이트 한 후 관리자 패널의 오른쪽이 사라집니다.

  26. 26

    Android 서비스가 터치 이벤트 수신

  27. 27

    업데이트 설치 후 컴퓨터가 부팅되지 않습니다!

  28. 28

    캔버스 이미지 비트 맵에 원터치 그리기

  29. 29

    Android Java : 비트 맵에 폴리 라인 그리기

뜨겁다태그

보관