2013-03-08 22 views
5

Ich habe ein Bild verwendet, das wir aus der Galerie auswählen oder vielleicht Kamera verwenden können. Ich verwende eine benutzerdefinierte Ansicht zum Zoomen und zum Freihandmalen. Ich habe Leinwand und Farbe für die Bearbeitung auf Bild verwendet, aber mein Problem ist, dass, wenn wir beginnen, auf Touch-Ereignis zu malen, aber nicht gleich x, y koordinieren Sie es unter viel zu berühren Punkt angezeigt. Bitte helfen Sie mir, wie mein Code zu verbessern mein Ziel mein Code zu erreichen, hier ist ...Freihandmalerei funktioniert nicht richtig?

public class EditImage extends Activity implements OnTouchListener{ 
TouchImageView edit_img;//custom image view 
Bitmap bitmap;  
String imagepath; 
Bitmap alteredBitmap,alteredBitmap1; 
Canvas canvas; 
Paint paint; 
Matrix matrix; 
float downx = 0; 
float downy = 0; 
float upx = 0; 
float upy = 0; 
int count=0; 

/** Called when the activity is first created. */ 
@SuppressWarnings("deprecation") 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.editscreen2); 
    // TODO Auto-generated method stub 
    Button back_btn=(Button)findViewById(R.id.back_button); 
    back_btn.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      finish(); 
     } 
    }); 

    Intent extras=getIntent();  
    Uri imageFileUri = Uri.parse(extras.getStringExtra("imagepath")); 
    edit_img=(TouchImageView)findViewById(R.id.editimage); 
    Log.i("imagepath2",imageFileUri+""); 
    try { 
     BitmapFactory.Options bmpFactoryOptions = new BitmapFactory.Options(); 
     bmpFactoryOptions.inJustDecodeBounds = false; 
       bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream 
         (imageFileUri), null, bmpFactoryOptions); 

     alteredBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap 
       .getHeight(), Config.ARGB_8888); 

     canvas = new Canvas(alteredBitmap); 
     paint = new Paint(); 
     paint.setColor(Color.BLACK); 
     paint.setAntiAlias(true); 
     paint.setDither(true); 

     paint.setStyle(Paint.Style.STROKE); 
     paint.setStrokeJoin(Paint.Join.ROUND); 
     paint.setStrokeCap(Paint.Cap.ROUND); 

      paint.setStrokeWidth(5);  
     matrix = new Matrix(); 
     canvas.drawBitmap(bitmap, matrix, paint); 
     Drawable drawable = (Drawable)new BitmapDrawable(alteredBitmap); 
     edit_img.setBackgroundDrawable(drawable); 

    } catch (Exception e) { 
     Log.v("ERROR", e.toString()); 
    } 
    edit_img.setOnTouchListener(this); 
    setfunction(); 
} 
private void setfunction() 
{ 

    Button done_btn=(Button)findViewById(R.id.done); 
    done_btn.setVisibility(View.VISIBLE); 
    done_btn.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) {  
      // TODO Auto-generated method stub 
      String root = Environment.getExternalStorageDirectory().toString(); 
      // File myDir = new File(root + "/saved_image); 
      String imagename = "Image.png"; 
      File file = new File (root, imagename); 
      if (file.exists()) file.delete(); 
     try { 
      FileOutputStream out = new FileOutputStream(file); 
      alteredBitmap.compress(Bitmap.CompressFormat.PNG, 90, out); 
       out.flush();  
       out.close(); 

      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

      Intent intent=new Intent(EditImage2.this,SaveImage.class); 
      intent.putExtra("imagepath",alteredBitmap); 
      startActivity(intent); 
     } 
    }); 

    Button erase_btn=(Button)findViewById(R.id.erase); 
    erase_btn.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      canvas.drawColor(0, Mode.CLEAR); 
      canvas.drawBitmap(bitmap,matrix, paint); 
     } 
    }); 
} 
public boolean onTouch(View v, MotionEvent event) { 
    if(event.getPointerCount()>1) 
    { 
     edit_img.setMaxZoom(4f); 
    } 
    else 
    { 
     int action = event.getAction();  
     switch (action) { 
     case MotionEvent.ACTION_DOWN: 
      downx = event.getX();  
      downy = event.getY(); 
      Log.i("touch points x,y",downx+"/"+downy); 
      break;  
     case MotionEvent.ACTION_MOVE: 
      upx = event.getX(); 
      upy = event.getY(); 
      Log.i("touch points upx,upy",upx+"/"+upy); 
      canvas.drawLine(downx, downy, upx, upy, paint); 
      downx = upx; 
      downy = upy; 
      Log.i("touch points x,y",downx+"/"+downy); 
      //edit_img.invalidate(); 
      v.invalidate(); 
      break; 
     case MotionEvent.ACTION_UP: 
      upx = event.getX(); 
      upy = event.getY(); 
      break; 
     case MotionEvent.ACTION_CANCEL:   
      break; 
     default: 
      break; 
     } 
    } 
    return true; 
} 

}

Antwort

0

Die Koordinaten Sie verwenden (von event.getX/Y()) sind nicht in Bezug auf den Punkt, den Sie denken, sie sind . Überprüfen Sie die Dokumentation und/oder geben Sie System.out.printlns ein, um dies zu überprüfen.

Sie müssen möglicherweise versetzt mit einem manuellen Arbeit (von der Leinwand absoluten Position gegeben), zum Beispiel.

Entschuldigung, ich bin nicht genauer: Ich war lange nicht mehr für Android. Das begann als Kommentar, wurde aber etwas lang.

+0

viel dank für die antwort, aber ich bekomme nicht, wie man leinwand absolute position bekommen kann können sie diesen point bitte ich bin neu in android .. –