如何编程9修补图像重新申请一个ImageView的?(How to programmatically

2019-06-24 12:11发布

我有一个具有Horizo​​ntalScrollView内定义的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);
 }

  ....

Answer 1:

编辑 :做了一些研究之后,我想通了。 而不是仅仅操纵位图,我还需要包括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:对于那些谁在我的解决方案看起来在这里,也看看下面关于内存管理凯的建议。 非常有用的信息。



Answer 2:

你为什么不只是包括两个不同的缩放图像,并利用它们之间进行切换imgResultMap.setImageResource(resId)变焦时? 另外请注意,您加载和创造UIThread位图这是不提供流畅的用户体验的好方法,至少预装位图的onCreate期间只有一次()和缓存这一点。



Answer 3:

移动此: ImageView imgResultMap = (ImageView)findViewById(R.id.imgResultMap); 向全球的onCreate方法intialized。 否则,该设备具有搜索视图,并发现它每次被点击的时间。

并尝试调用imgResultMap.invalidate(); 你从onDoubleTap方法返回之前( http://developer.android.com/reference/android/view/View.html#invalidate() )



Answer 4:

9片图像似乎只工作时,他们设置为View的背景图像。 所以:

  • 而不是android:src ,设置android:background在你的布局XML,以及
  • 调用setBackgroundResource()当你想改变形象。

您也可以使用普通View代替的ImageView ,如果你想; 它并不真正的问题太多。



Answer 5:

还另一种解决方案是以编程方式设置图像作为ImageResource并设置scaleType

imageView.setImageResource(R.drawable.favorite_driver_icon);
imageView.setScaleType(ScaleType.FIT_XY);


文章来源: How to programmatically re-apply a 9-patch image to an ImageView?