n00b programmer
n00b programmer

Reputation: 2701

Android scroll through in-app images in a gallery style way

I have a GridView of images, which are all in the /res directory (come with the app). When I open one of them, there is no problem. But, I want to be able to scroll between them also in the same way that's done in the gallery, i.e. sliding the finger on the image will cause the next image to appear. Is there any way to do that? Thanks!

Upvotes: 3

Views: 2785

Answers (2)

n00b programmer
n00b programmer

Reputation: 2701

I ended up creating a simple implementation of my own:

public class PicView extends View{

private int mBackgroundPicPosition;
private Bitmap mBackgroundPic;
private int m_touchStartPosX;
private EventsActivity m_mainActivity;
private int m_viewWidth;
private int m_viewHeight;
private int m_backgroundX;
private Integer[] m_picIDs;

public PicView(Context context, Integer[] picIDs) {
    super(context);
    m_mainActivity = (EventsActivity)context;
    m_viewWidth = m_mainActivity.mMetrics.widthPixels;
    m_viewHeight = m_mainActivity.mMetrics.heightPixels;
    m_picIDs = picIDs;
}
public void setBackground(int position) {
    Options opts = new Options();
    mBackgroundPicPosition = position;
    Bitmap bitmap = BitmapFactory.decodeResource(getResources(), m_picIDs[position], opts);
    mBackgroundPic = BitmapFactory.decodeResource(getResources(), m_picIDs[position], opts);

    int picHeight = bitmap.getHeight();
    int picWidth = bitmap.getWidth();

    mBackgroundPic.recycle();
    float xScale, yScale, scale;
    if (picWidth > picHeight) {
        // rotate the picture
        Matrix matrix = new Matrix();
        matrix.postRotate(-90);
        bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
        picHeight = bitmap.getHeight();
        picWidth = bitmap.getWidth();
        matrix = null;  

    } 
    xScale = ((float)m_viewWidth)/ picWidth;     
    yScale = ((float)m_viewHeight) / picHeight;
    scale = (xScale <= yScale) ? xScale : yScale;
    m_backgroundX = (xScale >= yScale) ? (m_viewWidth - (int)(picWidth * scale)) / 2 : 0;
    mBackgroundPic = Bitmap.createScaledBitmap(bitmap, (int)(picWidth * scale), (int)(picHeight * scale), true);
    bitmap = null;

    invalidate();
}

@Override
protected void onDraw(Canvas canvas) {
    // draw the background
    canvas.drawBitmap(mBackgroundPic, m_backgroundX, 0, null);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    int eventaction = event.getAction();
    int X = (int)event.getX();

    switch (eventaction ) {
        case MotionEvent.ACTION_DOWN:
            m_touchStartPosX = X;
        break;
        case MotionEvent.ACTION_UP:
            //check to see if sliding picture
            if (X <= m_touchStartPosX) {
                // slide to the left
                setBackground(getNextPosition());
            } else {
                // slide to the right
                setBackground(getPrevPosition());
            }
            m_touchStartPosX = -1;  
        break;
    }
    invalidate();  
    return true;

}

private int getPrevPosition() {
    if (mBackgroundPicPosition == 0) {
        return m_picIDs.length - 1;
    } else {
        return mBackgroundPicPosition - 1;
    }
}

private int getNextPosition() {
    if (mBackgroundPicPosition == m_picIDs.length - 1) {
        return 0;
    } else {
        return mBackgroundPicPosition + 1;
    }
}

Upvotes: 1

FoamyGuy
FoamyGuy

Reputation: 46856

You can use ViewPager

See android viewPager implementation for some good links to learn how to implement it.

Upvotes: 2

Related Questions