5

水平スクロールビュー内にImageViewが定義されているアクティビティがあります。画像ソースは、画面全体に表示されるように右端のみを拡大するように制限された9パッチファイルです。ビットマップのサイズを変更し、新しいビットマップをビューに割り当てることで、ユーザーがダブルタップしてズームインおよびズームアウトできる単純なズーム機能を実装しました。私の現在の問題は、ダブルタップしてズームアウトするときに、新しいサイズ変更されたビットマップをビューに割り当てたときに9パッチが適用されないことです。つまり、9パッチファイルで定義されているように右端だけを拡大するのではなく、画像全体を拡大しました。

これが私のXMLです:

<HorizontalScrollView
            android:id="@+id/hScroll"
            android:fillViewport="true"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:fadingEdge="none" >

            <RelativeLayout
                android:id="@+id/rlayoutScrollMap"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent" >

                <ImageView
                    android:id="@+id/imgResultMap"
                    android:layout_width="fill_parent"
                    android:layout_height="fill_parent"
                    android:scaleType="fitXY"
                    android:src="@drawable/map_base"/>

            </RelativeLayout>
        </horizontalScrollView>

onDoubleTap()呼び出し内の私のコードの関連部分は次のとおりです。

public boolean onDoubleTap(MotionEvent e)  
                {  
                    if (zoom == 1) {
                        zoom = 2; // zoom out
                    } else {
                        zoom = 1; // zoom in
                    }
                    Bitmap image = BitmapFactory.decodeResource(getResources(),R.drawable.map_base);            
                    Bitmap bmp = Bitmap.createScaledBitmap(image, image.getWidth() * zoom, image.getHeight() * zoom, false);
                    ImageView imgResultMap = (ImageView)findViewById(R.id.imgResultMap);
                    imgResultMap.setImageBitmap(bmp);

                    return false; 
                } 

編集:いくつかの調査を行った後、私はそれを理解しました。ビットマップを操作するだけでなく、ビットマップイメージの一部ではない9パッチチャンクも含めて、新しい9パッチドローアブルを再構築する必要があります。以下のサンプルコードを参照してください。

    ...
 else {
        // Zoom out
        zoom = 1;
        Bitmap mapBitmapScaled = mapBitmap; 
        // Load the 9-patch data chunk and apply to the view
        byte[] chunk = mapBitmap.getNinePatchChunk();
        NinePatchDrawable mapNinePatch = new NinePatchDrawable(getResources(), 
            mapBitmapScaled, chunk, new Rect(), null);
        imgResultMap.setImageDrawable(mapNinePatch);
 }

  ....
4

5 に答える 5

10

編集:いくつかの調査を行った後、私はそれを理解しました。ビットマップを操作するだけでなく、ビットマップイメージの一部ではない9パッチチャンクも含めて、新しい9パッチドローアブルを再構築する必要があります。以下のサンプルコードを参照してください。

    ...
 else {
        // Zoom out
        zoom = 1;
        Bitmap mapBitmapScaled = mapBitmap; 
        // Load the 9-patch data chunk and apply to the view
        byte[] chunk = mapBitmap.getNinePatchChunk();
        NinePatchDrawable mapNinePatch = new NinePatchDrawable(getResources(), 
            mapBitmapScaled, chunk, new Rect(), null);
        imgResultMap.setImageDrawable(mapNinePatch);
 }

  ....

編集#2:ここで私の解決策を見ている人は、メモリ管理に関する以下のKaiの提案も見てください。非常に役立つ情報。

于 2012-05-17T16:45:54.223 に答える
1

imgResultMap.setImageResource(resId)2つの異なる拡大縮小画像を含めて、ズーム時に使用してそれらを切り替えてみませんか?また、UIThreadでビットマップをロードおよび作成していることにも注意してください。これはスムーズなユーザーエクスペリエンスを提供するための良い方法ではありません。少なくともonCreate()中にビットマップを1回だけプリロードし、それをキャッシュします。

于 2012-05-17T02:01:32.027 に答える
0

これを移動します: ImageView imgResultMap = (ImageView)findViewById(R.id.imgResultMap); onCreateメソッドで初期化されたグローバルに移動します。それ以外の場合、デバイスはビューを検索し、タップするたびにそれを見つける必要があります。

imgResultMap.invalidate();onDoubleTapメソッドから戻る前に呼び出してみてください( http://developer.android.com/reference/android/view/View.html#invalidate()

于 2012-05-16T17:53:21.260 に答える
0

9パッチ画像は、Viewの背景画像として設定されている場合にのみ機能するようです。それで:

  • の代わりに、レイアウトXMLにandroid:src設定し、android:background
  • setBackgroundResource()画像を変更したいときに電話してください。

View必要に応じて、の代わりにプレーンを使用することもできImageViewます。それほど重要ではありません。

于 2013-04-01T18:42:12.107 に答える
0

また、別の解決策は、プログラムでImageResourceとして画像を設定し、scaleTypeを設定することです。

imageView.setImageResource(R.drawable.favorite_driver_icon);
imageView.setScaleType(ScaleType.FIT_XY);
于 2013-12-19T11:40:08.713 に答える