自由手绘画不能正常工作?

时间:2013-03-08 23:57:36

标签: android android-widget

我使用的图像可以从图库中选择,也可以使用相机。我正在使用自定义视图进行缩放和自由手绘。我已经使用了画布和油漆来编辑它的图像,但我的问题是,当我们开始绘制触摸事件时,它被绘制但不是相同的x,y坐标它显示在很多触点之下。请帮助我如何改进我的代码以实现我的目标我的代码在这里...

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

}

1 个答案:

答案 0 :(得分:0)

您正在使用的坐标(来自event.getX/Y())与您认为的坐标无关。查看文档,和/或放置一些System.out.printlns来验证这一点。

例如,您可能需要使用手动偏移(由画布绝对位置给出)。

对不起,我不是更具体:我已经离开Android很长一段时间了。这开始是一个评论,但有点长。