package me.xiaopan.android.examples.widget; import java.lang.reflect.Field; import android.R.attr; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Camera; import android.graphics.Matrix; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.view.animation.Transformation; import android.widget.Gallery; /** * 左对齐Gallery */ @SuppressWarnings("deprecation") public class LeftAlignGallery extends Gallery { private Camera mCamera; private int offsetX; private int mWidth; private int mPaddingLeft; private int firstChildWidth; private int firstChildPaddingLeft; private boolean flag; private IOnItemClickListener mListener; public LeftAlignGallery(Context context) { super(context); mCamera = new Camera(); this.setStaticTransformationsEnabled(true); } public LeftAlignGallery(Context context, AttributeSet attrs) { super(context, attrs); mCamera = new Camera(); this.setStaticTransformationsEnabled(true); 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(); flag = false; } offsetX = firstChildWidth / 2 + firstChildPaddingLeft + mPaddingLeft - mWidth / 2; 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 * 2; // getLayoutParams().width = mWidth; // flag = true; // } super.onSizeChanged(w, h, oldw, oldh); } public void setOnItemClickListener(IOnItemClickListener listener) { mListener = listener; } @Override public boolean onSingleTapUp(MotionEvent e) { try { Field f = LeftAlignGallery.class.getSuperclass().getDeclaredField("mDownTouchPosition"); f.setAccessible(true); int position = f.getInt(this); 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 interface IOnItemClickListener { public void onItemClick(int position); } }