简体   繁体   English

缩放影像

[英]Image Over Zooming

I have this code from a tut that enables scrolling and zooming of an image, but even if the image is small, the code will stretch the image so that It will fill the whole screen. 我有一个来自tut的代码,该代码可以滚动和缩放图像,但是即使图像很小,该代码也会拉伸图像,使其充满整个屏幕。 I want it to have a dialog maybe that contains the image and enables the zooming and scrolling by modifying the code without occupying the whole screen. 我希望它有一个对话框,其中可能包含图像,并且可以通过修改代码而不占用整个屏幕的方式来进行缩放和滚动。

Edit: Is it possible to have a limit in scrolling or limit the size of the image using the code below? 编辑:是否可以使用以下代码来限制滚动或限制图像的大小? There is a default image size on the first display(centered), which is also the minimum zoom out. 第一个显示器上有一个默认的图像尺寸(居中),这也是最小的缩小。 When the image reached its maximum scrollable size(real image size) it will go back to the default size. 当图像达到最大可滚动尺寸(实际图像尺寸)时,它将恢复为默认尺寸。 If possible, to also control the area where the image can be scrolled, so that I will not be lost in zooming in. 如果可能的话,还要控制可以滚动图像的区域,这样我就不会迷失于放大。

public class ZoomHelloActivity extends Activity {

     // Physical display width and height.
    private static int displayWidth = 0;
    private static int displayHeight = 0;


    static String img="";

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Display display = ((WindowManager)
                          getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
        displayWidth = display.getWidth();
        displayHeight = display.getHeight();

        //get intent
        Bundle extras = getIntent().getExtras(); 

        if (extras != null) {
            Toast.makeText(this.getBaseContext(),"Inside: "+img.toString(),
                   Toast.LENGTH_SHORT).show();
            img = extras.getString("img");
            // and get whatever type user account id is
        }
        else{   Toast.makeText(this.getBaseContext(),"ERROR ni",
                   Toast.LENGTH_SHORT).show();}
        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.
            int assignImg;
            assignImg = Integer.parseInt(img);
            bmLargeImage = BitmapFactory.decodeResource(getResources(),
                    assignImg);
        }

        @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) {
            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;
        }
    }
}

Edit: Wanted output: 编辑:想要的输出: 在此处输入图片说明

Maybe try the following: 也许尝试以下方法:

In the OnCreate() method instead of this: OnCreate()方法中,而不是这样:

displayWidth = display.getWidth();
displayHeight = display.getHeight();

Put the following: 输入以下内容:

private static Bitmap bmLargeImage;
bmLargeImage = BitmapFactory.decodeResource(getResources(), assignImg);
int bmWidth  = bmLargeImage.getWidth();
int bmHeight = bmLargeImage.getHeight();

displayWidth = display.getWidth();
displayHeight = display.getHeight();

if (bmWidth < displayWidth){
  displayWidth = bmWidth;
}
if (bmHeight < displayHeight){
  displayHeight = bmHeight;
}

See if this can bypass the algorithm from the tut. 看看这是否可以绕过tut的算法。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM