Android: прекратите масштабирование изображения

Я пытаюсь сделать изображение в представлении, но у меня проблемы с сохранением масштаба исходного изображения. В принципе, у меня есть небольшое представление, и я хотел бы показать часть изображения в представлении. Тогда намерение состоит в том, чтобы выполнить трансляцию на изображении, чтобы в представлении появилась другая часть.

Независимо от того, что я пытаюсь, либо изображение автоматически масштабируется, чтобы соответствовать представлению, либо все изображение доступно для просмотра. Я пробовал играть с настройками в BitmapDrawable, ImageView и Layout безрезультатно.

Кто-нибудь знает хороший способ добиться этого?

Solutions Collecting From Web of "Android: прекратите масштабирование изображения"

Надежда Эта часть кода помогает. Я отправил его через месяц месяц назад. Это прокрутка производительности для больших изображений. Здесь весь размер дисплея задается как высота и ширина представления. Вы можете изменить, что знаете. А также может поддерживать элементы управления масштабированием.

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's 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; } } } 

Это, вероятно, не самый эффективный способ, но если вы не собираетесь слишком сильно его перемещать, это будет сделано. Обращайтесь с ним как с spritesheet, используйте Bitmap.createBitmap (Bitmap source, int x, int y, int width, int height), чтобы получить нужный раздел из исходного растрового изображения в качестве собственного растрового изображения, а затем передать это вместо. Затем передайте это, а не целое растровое изображение, и оно будет работать только с той частью, которую вы хотите показать.

Похоже, что вы хотите иметь большой элемент управления ImageView внутри меньшего вида (действующего как окно), а затем перемещать элемент управления ImageView внутри него, поэтому только часть его видна за раз.

Не совсем точно, как вы это сделаете, но вполне уверен, что это возможно с AbsoluteLayout и немного возиться.