5

我使用了一张我们可以从图库中选择的图像,或者使用相机。我正在使用自定义视图进行缩放和自由手绘。我已经使用画布和绘画在图像上进行编辑,但我的问题是,当我们开始在触摸事件上绘画时,它被绘制但 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;   
}

}

4

1 回答 1

0

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

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

抱歉,我没有更具体:我已经离开 Android 很长时间了。这开始是一个评论,但有点长。

于 2013-03-09T00:18:36.160 回答