I have an activity that has an ImageView defined inside a HorizontalScrollView. The image source is a 9-patch file that is constrained to stretch only the right edge to fill
9-patch images seem to only work when they're set as a View
's background image. So:
android:src
, set android:background
in your layout XML, andsetBackgroundResource()
when you want to change the image.You can also use a plain View
instead of an ImageView
if you want; it doesn't really matter much.
Move this:
ImageView imgResultMap = (ImageView)findViewById(R.id.imgResultMap);
to a global intialized in the onCreate method. Otherwise the device has to search for the view and find it every time it is tapped.
and try calling imgResultMap.invalidate();
before you return from the onDoubleTap method
(http://developer.android.com/reference/android/view/View.html#invalidate())
EDIT: After doing some research, I have it figured out. Instead of just manipulating the bitmap, I need to also include the 9-patch chunk, which is not part of the bitmap image, to re-construct a new 9-patch drawable. See sample code below:
...
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);
}
....
EDIT #2: For those who looks at my solution here, also take a look at Kai's suggestions below regarding memory management. Very useful information.
Also another solution is to set image programmatically as ImageResource and set scaleType
imageView.setImageResource(R.drawable.favorite_driver_icon);
imageView.setScaleType(ScaleType.FIT_XY);
Why don't you just include two different scaled images and switch between them using imgResultMap.setImageResource(resId)
when zooming? Also note that you are loading & creating Bitmaps in UIThread which is not a good way to provide smooth user experience, at least preload the bitmap only once during onCreate() and cache that.