Android: stop image scaling

I am trying to make an image in a view, but I am having trouble maintaining the scale of the original image. Basically, I have a small view, and I would like to show part of the image in the view. Then the intention is to translate the image so that the other part is displayed in the view.

No matter what I try, either the image is automatically scaled to fit the view, or the whole image can be viewed. I tried playing with the settings in BitmapDrawable, ImageView and Layout to no avail.

Does anyone know a good way to achieve this?

+7
android user-interface image view scale
source share
3 answers

Hope This piece of code helps. A month ago, I sent it to Google. This is a performance scroll for large images. Here, the entire display size is specified as the height and width of the view. You can change what you know. and can also support zoom controls.

public class LargeImageScroller extends Activity { // Physical display width and height. private static int displayWidth = 0; private static int displayHeight = 0; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // displayWidth and displayHeight will change depending on screen // orientation. To get these dynamically, we should hook onSizeChanged(). // This simple example uses only landscape mode, so it ok to get them // once on startup and use those values throughout. Display display = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); displayWidth = display.getWidth(); displayHeight = display.getHeight(); // SampleView constructor must be constructed last as it needs the // displayWidth and displayHeight we just got. setContentView(new SampleView(this)); } private static class SampleView extends View { private static Bitmap bmLargeImage; //bitmap large enough to be scrolled private static Rect displayRect = null; //rect we display to private Rect scrollRect = null; //rect we scroll over our bitmap with private int scrollRectX = 0; //current left location of scroll rect private int scrollRectY = 0; //current top location of scroll rect private float scrollByX = 0; //x amount to scroll by private float scrollByY = 0; //y amount to scroll by private float startX = 0; //track x from one ACTION_MOVE to the next private float startY = 0; //track y from one ACTION_MOVE to the next public SampleView(Context context) { super(context); // Destination rect for our main canvas draw. It never changes. displayRect = new Rect(0, 0, displayWidth, displayHeight); // Scroll rect: this will be used to 'scroll around' over the // bitmap in memory. Initialize as above. scrollRect = new Rect(0, 0, displayWidth, displayHeight); // Load a large bitmap into an offscreen area of memory. bmLargeImage = BitmapFactory.decodeResource(getResources(), R.drawable.testlargeimage); } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: // Remember our initial down event location. startX = event.getRawX(); startY = event.getRawY(); break; case MotionEvent.ACTION_MOVE: float x = event.getRawX(); float y = event.getRawY(); // Calculate move update. This will happen many times // during the course of a single movement gesture. scrollByX = x - startX; //move update x increment scrollByY = y - startY; //move update y increment startX = x; //reset initial values to latest startY = y; invalidate(); //force a redraw break; } return true; //done with this event so consume it } @Override protected void onDraw(Canvas canvas) { // Our move updates are calculated in ACTION_MOVE in the opposite direction // from how we want to move the scroll rect. Think of this as dragging to // the left being the same as sliding the scroll rect to the right. int newScrollRectX = scrollRectX - (int)scrollByX; int newScrollRectY = scrollRectY - (int)scrollByY; // Don't scroll off the left or right edges of the bitmap. if (newScrollRectX < 0) newScrollRectX = 0; else if (newScrollRectX > (bmLargeImage.getWidth() - displayWidth)) newScrollRectX = (bmLargeImage.getWidth() - displayWidth); // Don't scroll off the top or bottom edges of the bitmap. if (newScrollRectY < 0) newScrollRectY = 0; else if (newScrollRectY > (bmLargeImage.getHeight() - displayHeight)) newScrollRectY = (bmLargeImage.getHeight() - displayHeight); // We have our updated scroll rect coordinates, set them and draw. scrollRect.set(newScrollRectX, newScrollRectY, newScrollRectX + displayWidth, newScrollRectY + displayHeight); Paint paint = new Paint(); canvas.drawBitmap(bmLargeImage, scrollRect, displayRect, paint); // Reset current scroll coordinates to reflect the latest updates, // so we can repeat this update process. scrollRectX = newScrollRectX; scrollRectY = newScrollRectY; } } } 
+2
source share

This is probably not the most efficient way, but if you are not going to move it too much, it will be done. Treat it like a spritesheet, use Bitmap.createBitmap (Bitmap source, int x, int y, int width, int height) to get the desired section from the original bitmap as your own bitmap, and then pass it instead. Then pass this, not the whole bitmap, and it will only work with the part you want to show.

0
source share

It looks like you want to have a large ImageView control inside a smaller view (acting like a window), and then move the ImageView control inside it, so only part of it is visible at a time.

Not quite sure how you will do this, but pretty sure that this is possible with AbsoluteLayout and messing around a bit.

0
source share

All Articles