Android以画廊风格的方式滚动浏览应用内图片

时间:2012-07-14 14:48:54

标签: android image view gallery

我有一个GridView图像,它们都在/ res目录中(随应用程序一起提供)。当我打开其中一个时,没有问题。但是,我希望能够以与在图库中完成相同的方式在它们之间滚动,即在图像上滑动手指将导致下一个图像出现。有没有办法做到这一点? 谢谢!

2 个答案:

答案 0 :(得分:2)

您可以使用ViewPager

请参阅android viewPager implementation以获取一些很好的链接,了解如何实施它。

答案 1 :(得分:1)

我最终创建了一个我自己的简单实现:

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