2

Android の中心点からビットマップを拡大してズーム効果を実現しようとしていますが、成功しません。私が持っているコードは次のとおりです。

float scaleWidth = ((float) width + (i * 5)) / width;
float scaleHeight = ((float) height + (i * 5)) / height;

Matrix matrix = new Matrix();
matrix.setScale(scaleWidth, scaleHeight, scaleWidth / 2, scaleHeight / 2);
Bitmap rescaledBitmap = Bitmap.createBitmap(src, 0, 0, width, height, matrix, true);

result.add(rescaledBitmap);

寸法を 2 で割ってピボット ポイントを設定していますが、その効果は、画像が中心からではなく座標として 0, 0 からスケーリングされることだけです。私が欲しいのは、画像を固定サイズにすることですが、中心点から拡大します(したがって、画像をトリミングします)。

4

3 に答える 3

3

プロパティアニメーターを使用した代替ソリューションを提供します。これは、よりクリーンなソリューションだと思います。

SomeLayout.xml (ここで重要なのは、ViewGroup が View と同じサイズであるため、要求どおりにクリップされることです (Google マップのズームインのように))

<FrameLayout
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:layout_gravity="center">
    <View
    android:id="@+id/zoom"
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:background="@drawable/myCoolImage"
    />
</FrameLayout>

コード: (1,2,1 は 1x のスケールで始まり、次に 2x から 1x に戻ります。値のリストを取ります)

final View view = findViewById(R.id.zoom);
view.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            final ObjectAnimator animator = ObjectAnimator.ofFloat(view, View.SCALE_X, 1, 2, 1)
                    .ofFloat(view, View.SCALE_Y, 1, 2, 1)
                    .setDuration(5000);
            animator.setInterpolator(new AccelerateDecelerateInterpolator());
            animator.start();
        }
    });

したがって、このバージョンのイメージでは、onClickListeners を使用した zoom + ビューと zoom - ビューがある場合、ズームする値がわかっている限り、制御されたズームを基本的にシミュレートできます。

また、前述のように、内部ビューと同じサイズの ViewGroup は、アニメーションを完全に表示するのではなく、強制的にその親境界にクリップします。

参考文献:

Google Android ObjectAnimator

于 2014-05-10T05:03:27.657 に答える
0

createBitmap の 2 番目と 3 番目の引数は、左上隅の x/y 座標を取ります。0,0 を送信しているということで、私の理解が正しければ...

画像は正しくスケーリングされていますが、画像が中央に配置されていませんよね?

中央に配置するには、左上隅の正しい (x,y) ポイントを見つける必要があります。これは、元の幅/高さの 1/4 にする必要があります。

そう...

Bitmap rescaledBitmap = Bitmap.createBitmap(src, (width/2), (height/2), width, height, matrix, true);

動作するはずです。

于 2013-09-25T14:31:12.317 に答える