2014-02-13 2 views
3

오전 사람들이 스케치를 그리고 갤러리에 저장할 수있는 앱을 만듭니다. 이 일을하고 잘하고 있습니다. 내가 할 수 있기를 원하는 것은 갤러리에서 이미지를 가져 와서 그 이미지를 그릴 수 있어야한다는 것입니다. 이미지를 선택하기 위해 Gallery를 가져올 수 있었지만 그 이미지를 캔버스에 담아 캔버스에 그려 넣을 방법을 찾지 못했습니다.그릴 이미지를 어떻게 그려야합니까?

하지만 문제는 갤러리를 여는 것입니다. 그러나 어떤 사진을 클릭해도 열리지는 않습니다. 사진이 없으면 사진으로 돌아 가지 않습니다 (내 화면은 이전과 동일하게 유지되고 새로운 사진이 없습니다). 그래서 문제가 무엇입니까?

내 Mainactivity 클래스

---

package com.example.drawingfun; 


import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.InputStream; 

import java.util.UUID; 


import android.net.Uri; 
import android.os.Bundle; 
import android.provider.MediaStore; 

import android.app.Activity; 
import android.view.Menu; 
import android.view.View; 
import android.widget.ImageButton; 

import android.widget.LinearLayout; 
import android.widget.Toast; 

import android.app.AlertDialog; 
import android.app.Dialog; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.database.Cursor; 


import android.graphics.Bitmap; 
import android.graphics.Bitmap.Config; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.graphics.drawable.BitmapDrawable; 
import android.graphics.drawable.Drawable; 


import android.view.View.OnClickListener; 





public class MainActivity extends Activity implements OnClickListener { 

    private DrawingView drawView; 
    private ImageButton currPaint,drawBtn,eraseBtn, newBtn,saveBtn,gal; 
    private float smallBrush, mediumBrush,largeBrush; 

    int GALLERY_INTENT_CALLED = 3; // has to be a unique request code 
    Drawable image; 



    @Override 
    protected void onCreate(Bundle savedInstanceState) { 




     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     drawView = (DrawingView)findViewById(R.id.drawing); 
     LinearLayout paintLayout = (LinearLayout)findViewById(R.id.paint_colors); 
     currPaint = (ImageButton)paintLayout.getChildAt(0); 
     currPaint.setImageDrawable(getResources().getDrawable(R.drawable.paint_pressed)); 
     smallBrush = getResources().getInteger(R.integer.small_size); 
     mediumBrush = getResources().getInteger(R.integer.medium_size); 
     largeBrush = getResources().getInteger(R.integer.large_size); 




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


     drawView.setBrushSize(mediumBrush); 
     eraseBtn = (ImageButton)findViewById(R.id.erase_btn); 
     eraseBtn.setOnClickListener(this); 
     newBtn = (ImageButton)findViewById(R.id.new_btn); 
     newBtn.setOnClickListener(this); 
     saveBtn = (ImageButton)findViewById(R.id.save_btn); 
     saveBtn.setOnClickListener(this); 
     gal = (ImageButton)findViewById(R.id.GalleryButton); 
     gal.setOnClickListener(this); 




    } 



    public void paintClicked(View view){ 



     drawView.setErase(false); 
     drawView.setBrushSize(drawView.getLastBrushSize()); 
     //use chosen color 

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







    } 




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











    @Override 
    public void onClick(View view){ 
     //respond to clicks 
     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); 


      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(); 
       } 
      }); 






      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); 

      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(); 
     } 










     else if(view.getId()==R.id.GalleryButton){ 
      //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){ 
        Intent choosePictureIntent = new Intent(
          Intent.ACTION_PICK, 
          android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
        startActivityForResult(choosePictureIntent, 101); 


       } 

      }); 
      newDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener(){ 
       public void onClick(DialogInterface dialog, int which){ 
        dialog.cancel(); 
       } 
      }); 
      newDialog.show(); 
     } 


    } 
















    public void setDrawingThemefrmGallery() 
    { 

     Intent pickPhoto = new Intent(
       Intent.ACTION_PICK, 
       android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
      startActivityForResult(pickPhoto, GALLERY_INTENT_CALLED); 

    } 

    public static Bitmap drawableToBitmap (Drawable drawable) { 
     if (drawable instanceof BitmapDrawable) { 
      return ((BitmapDrawable)drawable).getBitmap(); 
     } 

     Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Config.ARGB_8888); 
     Canvas canvas = new Canvas(bitmap); 
     drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); 
     drawable.draw(canvas); 

     return bitmap; 
    } 



    protected void onActivityResult(int requestCode, int resultCode, 
      Intent returnedIntent) { 
     drawView.drawImage(drawableToBitmap(image)); 
     super.onActivityResult(requestCode, resultCode, returnedIntent); 
    if (requestCode == GALLERY_INTENT_CALLED) { 
     if (resultCode == RESULT_OK) { 
      try { 
       Uri selectedImage = returnedIntent.getData(); 
       InputStream inputStream = getContentResolver().openInputStream(selectedImage); 
       image = Drawable.createFromStream(inputStream, selectedImage.toString()); 
      } catch (FileNotFoundException e) {} 
     } 
    } 
} 













} 

내 DrawingView 클래스 ---

package com.example.drawingfun; 

import java.io.File; 

import android.view.View; 
import android.content.Context; 
import android.content.Intent; 
import android.database.Cursor; 
import android.net.Uri; 
import android.provider.MediaStore; 
import android.util.AttributeSet; 
import android.graphics.Bitmap; 
import android.graphics.Bitmap.Config; 
import android.graphics.BitmapFactory; 
import android.graphics.BitmapShader; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.CornerPathEffect; 
import android.graphics.Paint; 
import android.graphics.Path; 
import android.graphics.Shader; 
import android.view.MotionEvent; 
import android.graphics.PorterDuff; 
import android.graphics.PorterDuffXfermode; 
import android.graphics.drawable.BitmapDrawable; 
import android.graphics.drawable.Drawable; 
import android.util.TypedValue; 



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 
    private Bitmap canvasBitmap; 
    private float brushSize, lastBrushSize; 
    private boolean erase=false; 



    public DrawingView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     setupDrawing(); 
     // TODO Auto-generated constructor stub 
    } 

    private void setupDrawing() { 
     // TODO Auto-generated method stub 



     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.FILL_AND_STROKE); 
     drawPaint.setStrokeJoin(Paint.Join.ROUND); 
     drawPaint.setStrokeCap(Paint.Cap.ROUND); 


     canvasPaint = new Paint(Paint.DITHER_FLAG); 




    } 

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

    @Override 
    protected void onDraw(Canvas canvas) { 
    //draw view 
     canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint); 
     canvas.drawPath(drawPath, drawPaint); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
    //detect user touch 
     float touchX = event.getX(); 
     float touchY = event.getY(); 
     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; 
     } 
     invalidate(); 
     return true; 
    } 

    public void setColor(String newColor){ 
     //set color 
     invalidate(); 
     if(newColor.startsWith("#")){ 
      paintColor = Color.parseColor(newColor); 
      drawPaint.setColor(paintColor); 
      drawPaint.setShader(null); 
     } 
     else{ 
      //pattern 
      int patternID = getResources().getIdentifier(
        newColor, "drawable", "com.example.drawingfun"); 
      //decode 
      Bitmap patternBMP = BitmapFactory.decodeResource(getResources(), patternID); 
      //create shader 
      BitmapShader patternBMPshader = new BitmapShader(patternBMP, 
        Shader.TileMode.REPEAT, Shader.TileMode.REPEAT); 
      //color and shader 
      drawPaint.setColor(0xFFFFFFFF); 
      drawPaint.setShader(patternBMPshader); 
     } 
     } 

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

    public void setLastBrushSize(float lastSize){ 
     lastBrushSize=lastSize; 
    } 
    public float getLastBrushSize(){ 
     return lastBrushSize; 
    } 


    public void setErase(boolean isErase){ 
     //set erase true or false 
     erase=isErase; 

     if(erase) 
     { 


      paintColor = Color.parseColor("WHITE"); 
      drawPaint.setColor(paintColor); 
      //drawPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); 
      drawPaint.setShader(null); 





     } 

     else 


      drawPaint.setXfermode(null); 

     } 

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





    public void drawImage(Bitmap image) { 
     drawCanvas.drawBitmap(image, 0, 0, canvasPaint); 
     invalidate(); 
    } 















    } 
+0

을 그릴 싶어 할 때마다 갤러리? 작은 이미지에서도 작동합니까? – donfuxx

+0

아니, 작은 또는 큰 이미지로 작동하지 ... 그냥 갤러리를 열면, 나는 그림을 선택 .... 그럼 그림없이 내 애플에 간다 – user3104665

+0

Logcat 출력을 추가 할 수 있습니까? – donfuxx

답변

0

당신은 비트 맵으로 이미지를로드 한 후 캔버스 객체를 사용하여 그릴 필요가있다.

this question을 참조하여 드로어 블을 비트 맵으로 변환하는 방법을 알아보십시오.

그리고이 예를 따르

public class DrawView extends View{ 

    private Paint bufferPaint; 
    private Bitmap buffer; 
    private Canvas board; 
    private Path currPath; 

    public DrawView(Context context) { 
     super(context); 
     bufferPaint = new Paint(Paint.DITHER_FLAG); 
    } 

    public void init() { 
     buffer = Bitmap.createBitmap(getWidth(), getHeight(), 
       Bitmap.Config.ARGB_8888); 
     board = new Canvas(buffer); 
     invalidate(); 
    } 

    public void drawBitmap(Bitmap bitmap) { 
     board.drawBitmap(bitmap, 0, 0, bufferPaint) 
    } 

    @Override 
    public void onDraw(Canvas canvas) { 
     if (buffer != null) { 
      canvas.drawBitmap(buffer, 0, 0, bufferPaint); 
     } 
    } 
} 

drawBitmap 방법은 트릭을 수행합니다. 이제 캔버스 객체 (보드)를 사용하여 Bitmap에 다른 것들을 그릴 수 있습니다.

수, 활동의 onActivityResult를에

Intent pickPhoto = new Intent(
       Intent.ACTION_PICK, 
       android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
startActivityForResult(pickPhoto, GALLERY_INTENT_CALLED); 

그런 다음이 코드를 사용하여이 방법을 쓰기 DrawingView의 이미지

protected void onActivityResult(int requestCode, int resultCode, 
      Intent returnedIntent) { 
     super.onActivityResult(requestCode, resultCode, returnedIntent); 
    if (requestCode == CAMERA_INTENT_CALLED) { 
     if (resultCode == RESULT_OK) { 
      try { 
       Uri selectedImage = returnedIntent.getData() 
       InputStream inputStream = getContentResolver().openInputStream(selectedImage); 
       image = Drawable.createFromStream(inputStream, selectedImage.toString()); 
      } catch (FileNotFoundException e) {} 
     } 
    } 
} 

을 사용자로부터이 전 세계적으로

int GALLERY_INTENT_CALLED = 3; // has to be a unique request code 
Drawable image; 

가져 오기 이미지를 정의

public void drawImage(Bitmap image) { 
    drawCanvas.drawBitmap(image, 0, 0, canvasPaint); 
    invalidate(); 
} 

사용이 게시물의 방법은 비트 맵으로 이미지를 변환 : 다음

public static Bitmap drawableToBitmap (Drawable drawable) { 
    if (drawable instanceof BitmapDrawable) { 
     return ((BitmapDrawable)drawable).getBitmap(); 
    } 

    Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Config.ARGB_8888); 
    Canvas canvas = new Canvas(bitmap); 
    drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); 
    drawable.draw(canvas); 

    return bitmap; 
} 

을 Mainactivity에 당신은 당신이 선택한 이미지가 얼마나 큰 이미지 호출

drawView.drawImage(drawableToBitmap(image)) 
+0

난 이해가 안 돼, 어디서 코드를 작성해야합니까? 내가 지워야 하나? – user3104665

+0

사용자가 drawView에서 어떻게 그리게 할 수 있습니까? View 객체를 확장하지 않습니까? 질문에 코드를 입력하면 더 쉽게 도울 수 있습니다. – mmbrian

+0

게시물을 편집하고 전체 코드 (두 클래스)를 제공했습니다. 도와주세요. – user3104665

관련 문제