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

使用している座標 (からevent.getX/Y()) は、あなたが考えている点に対して相対的ではありません。ドキュメントを確認するか、これを確認するためにいくつか入れてくださいSystem.out.printlns

たとえば、手動オフセット (キャンバスの絶対位置によって指定) を使用する必要がある場合があります。

申し訳ありませんが、具体的ではありません。私は長い間 Android を使用していません。これはコメントとして始まりましたが、少し長くなりました。

于 2013-03-09T00:18:36.160 に答える