Gallery居左 点击禁止滑动

两种方法:

1、重写Gallery,需要设置Gallery的宽度为固定值,fill_parent也不行;

2、设置Gallery属性android:ScrollX的值,缺点setOnClickItemListener时,由于水平偏移,导致item点击事件位置不准确

目前,对于Gallery的两端对齐暂时无法实现

重写Gallery方法如下:

public class BookcaseGallery extends Gallery {
    private Camera mCamera;
    private int mWidth;
    private int mPaddingLeft;
    private boolean flag;
    private static int firstChildWidth;
    private static int firstChildPaddingLeft;
    private int offsetX;
    private IOnItemClickListener mListener;

    public BookcaseGallery(Context context) {
        super(context);
        mCamera = new Camera();
        this.setStaticTransformationsEnabled(true);
    }

    public BookcaseGallery(Context context, AttributeSet attrs) {
        super(context, attrs);
        mCamera = new Camera();
        setAttributesValue(context, attrs);
        this.setStaticTransformationsEnabled(true);
    }

    public BookcaseGallery(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        mCamera = new Camera();
        setAttributesValue(context, attrs);
        this.setStaticTransformationsEnabled(true);
    }

    private void setAttributesValue(Context context, AttributeSet attrs) {
        TypedArray typedArray = context.obtainStyledAttributes(attrs,
                new int[] { attr.paddingLeft });
        mPaddingLeft = typedArray.getDimensionPixelSize(0, 0);
        typedArray.recycle();
    }

    protected boolean getChildStaticTransformation(View child, Transformation t) {
        t.clear();
        t.setTransformationType(Transformation.TYPE_MATRIX);
        mCamera.save();
        final Matrix imageMatrix = t.getMatrix();
        if (flag) {
            firstChildWidth = getChildAt(0).getWidth();
            firstChildPaddingLeft = getChildAt(0).getPaddingLeft();
        }
        offsetX = firstChildWidth / 2 + firstChildPaddingLeft + mPaddingLeft
                - mWidth / 2 + 10;
        mCamera.translate(offsetX, 0f, 0f);
        mCamera.getMatrix(imageMatrix);
        mCamera.restore();
        return true;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        event.offsetLocation(-offsetX, 0);
        return super.onTouchEvent(event);
    }

    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        if (!flag) {
            mWidth = w;
            getLayoutParams().width = mWidth;
            flag = true;
        }
        super.onSizeChanged(w, h, oldw, oldh);
    }

    @Override
    public boolean onSingleTapUp(MotionEvent e) {
        try {//若return false将导致onClickItemListener无法使用,获得位置后就可以接着用
            Field f = BookcaseGallery.class.getSuperclass().getDeclaredField(
                    "mDownTouchPosition");
            f.setAccessible(true);
            int position = f.getInt(this);
            Log.i("aaa", "mDownTouchPosition = " + position);
            if (null != mListener && position >= 0) {
                mListener.onItemClick(position);
            }
        } catch (SecurityException e1) {
            e1.printStackTrace();
        } catch (NoSuchFieldException e1) {
            e1.printStackTrace();
        } catch (IllegalArgumentException e2) {
            e2.printStackTrace();
        } catch (IllegalAccessException e3) {
            e3.printStackTrace();
        }
        return false;
    }

    public void setOnItemClickListener(IOnItemClickListener listener) {
        mListener = listener;
    }

    public interface IOnItemClickListener {
        public void onItemClick(int position);
    }
}

工程下载:AlignLeftGallery.rar

posted @ 2012-12-16 17:48  ok_lanyan  阅读(2923)  评论(0编辑  收藏  举报