1

電話ギャラリーから選択してトリミングした画像を編集する必要がある Android アプリを作成しています。

したがって、私のレイアウトには、トリミングされた画像を配置する ImageView があります

xml ファイル

<ImageView
    android:id="@+id/ivEditPhoto"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_gravity="center"
    android:layout_weight=".90"
    android:src="@drawable/app_icon_big" />

トリミングした画像を ImaveView に配置する

bitmapPic = (Bitmap) getIntent().getParcelableExtra(
            "CroppedBitmapImage");
picView = (ImageView) findViewById(R.id.ivEditPhoto);
        picView.setImageBitmap(bitmapPic);

画像が正しく配置されています。しかし、問題はそれを編集しようとするときです。編集ボタンがあり、それをクリックすると、オンタッチリスナーの登録を含む次の操作を行います。

DisplayMetrics displaymetrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
        int height = displaymetrics.heightPixels;
        int width = displaymetrics.widthPixels;
        Bitmap alteredPastedBitmap = Bitmap.createBitmap(bitmapPic.getWidth(),
                bitmapPic.getHeight(), bitmapPic.getConfig());
        pasteCanvas = new Canvas(alteredPastedBitmap);
        paint = new Paint();
        paint.setColor(Color.GREEN);
        paint.setStrokeWidth(5);
        matrix = new Matrix();
        pasteCanvas.drawBitmap(bitmapPic, matrix, paint);
        picView.setOnTouchListener(this);

次に、次の

public boolean onTouch(View v, MotionEvent event) {
    Toast.makeText(this, v.getId(), Toast.LENGTH_SHORT).show();
    if (v.getId() == R.id.ivEditPhoto) {

        Toast.makeText(this, "onTouch", Toast.LENGTH_SHORT).show();
        int action = event.getAction();
        x = event.getX();
        y = event.getY();
        switch (action) {
        case MotionEvent.ACTION_DOWN:
            sX = event.getX();
            sY = event.getY();
            break;
        case MotionEvent.ACTION_UP:
            if (skewedBitmap == null) {
                int resID = 0;
                if (imageId == 0)
                    resID = R.drawable.green_arrow;
                else
                    resID = imageId;
                bitmapToPaste = BitmapFactory.decodeResource(
                        getResources(), resID);
            } else {
                bitmapToPaste = skewedBitmap;
                skewedBitmap = null;
            }
            pasteCanvas.drawBitmap(bitmapToPaste, sX- (bitmapToPaste.getWidth() / 2),sY- (bitmapToPaste.getHeight() / 2), null);
            picView.invalidate();
            break;
        case MotionEvent.ACTION_CANCEL:
            break;
        default:
            break;
        }
    }
    return true;
}

問題は次のとおりです。bitmapPic.getWidth() と bitmapPic.getHeight() は 160*160 で、onTouch event.getX(); です。および event.getY(); 座標を超えています (例: 150.33 & 500.89) が、画像が画面全体を占めているように見え、タッチが画像上にあります。そのため、onTouch はビットマップを配置せず、false を返します。これについて私を案内してもらえますか?

4

1 に答える 1

0

アプリケーションの 1 つで同じ問題が発生しました。あなたのコードをもっと見る必要がありますが、これは実装する必要がある onInterceptTouch() メソッドに関連している可能性があります。

そうでない場合は、ビットマップを移動、変更、回転する方法について、次のコードを調べることができます。

http://adblogcat.com/custom-view-to-draw-rotate-erase-and-convert-images-to-black-and-white/

私はこのチュートリアルを書きましたが、これは私のウェブサイトです。ここに貼り付けるよりも、そのチュートリアルに従う方が簡単だと思います。

于 2013-04-22T20:20:41.203 に答える