Pergunta

I just need to set a high res image, but wants to know if its possible to set it in xml. I want to be able to set it even if it will be bigger than the mobile screen.

EDIT: I want to add a huge image, so the user will have to scroll it. Something like a map, but need to add clickable areas on it and I only know how to do this in xml. That's why I asked to add the image using xml not in java. But if someone can tell me how to add clickable areas in java. That will do it better, since I already have the image but using java and its able to scroll.

EDIT: Heres where I got the code from : Anddev.org I'm using exactly the same code, just with other image.

Foi útil?

Solução 3

Ok I'm posting this as an answer, just because it will be easier to post this. (It's not working how I want it to, but I got something) I want to share this so anyone else, who knows how to, can help me out here to find a solution for this one. This is the code

package com.example.largeimagescroller;

import android.app.Activity;
import android.os.Bundle;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.view.Display;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.Toast;

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.alienware);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        //This code define what to do if you touch the x and y coordinates.
        float x1 = event.getX();
        float y1 = event.getY();

            switch (event.getActionMasked()){
            case MotionEvent.ACTION_DOWN:
                if (x1>150 & x1<200 & y1>400 & y1<500){
                    Toast.makeText(getContext(), "Touched the coordinates.", Toast.LENGTH_SHORT).show();
                }
            }

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

I rec the application in use. (Since touch events don't work with cpu emulators I did it on my phone)

http://www.youtube.com/watch?v=NrszZoDenXE&feature=youtube_gdata

As you can see its taking the touch, but it moves with the scroll rect, so the question will be: How can I do the touch to stay in the image, so it doesn't move with the scrolling rect?

Thanks

Outras dicas

What are you trying for? In android the resolutions are based on like below -

Screen Support

MultipleResolution

Just read out this. Hope these two links enough for your query.

Have a look at this sample code to see how to scroll an image larger than the screen. It also does bitmap caching to speed up drawing of a complex image, and shows how to respond to long-taps and double-taps at any point on the image.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top