android中有很多的电子书阅读应用,应用中都仿真了书架的实现,这里也分享一篇读书应用的书架实现: 

 java:

public class ShelvesView extends GridView {     private Bitmap mShelfBackground;     private int mShelfWidth;     private int mShelfHeight;      private Bitmap mWebLeft;     private Bitmap mWebRight;     private int mWebRightWidth;      public ShelvesView(Context context) {         super(context);         init(context);     }      public ShelvesView(Context context, AttributeSet attrs) {         super(context, attrs);         load(context, attrs, 0); 		init(context);     }      public ShelvesView(Context context, AttributeSet attrs, int defStyle) {         super(context, attrs, defStyle);         load(context, attrs, defStyle);         init(context);     }      private void load(Context context, AttributeSet attrs, int defStyle) {         TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ShelvesView, defStyle, 0);          final Resources resources = getResources();         final int background = a.getResourceId(R.styleable.ShelvesView_shelfBackground, 0);         final Bitmap shelfBackground = BitmapFactory.decodeResource(resources, background);         if (shelfBackground != null) {             mShelfWidth = shelfBackground.getWidth();             mShelfHeight = shelfBackground.getHeight();             mShelfBackground = shelfBackground;         }          mWebLeft = BitmapFactory.decodeResource(resources, R.drawable.web_left);          final Bitmap webRight = BitmapFactory.decodeResource(resources, R.drawable.web_right);         mWebRightWidth = webRight.getWidth();         mWebRight = webRight;          a.recycle();     }      private void init(Context context) {         StateListDrawable drawable = new StateListDrawable();          SpotlightDrawable start = new SpotlightDrawable(context, this);         start.disableOffset();         SpotlightDrawable end = new SpotlightDrawable(context, this, R.drawable.spotlight_blue);         end.disableOffset();         TransitionDrawable transition = new TransitionDrawable(start, end);         drawable.addState(new int[] { android.R.attr.state_pressed },                 transition);          final SpotlightDrawable normal = new SpotlightDrawable(context, this);         drawable.addState(new int[] { }, normal);          normal.setParent(drawable);         transition.setParent(drawable);          setSelector(drawable);         setDrawSelectorOnTop(false);     }      @Override     protected void dispatchDraw(Canvas canvas) {         final int count = getChildCount();         final int top = count > 0 ? getChildAt(0).getTop() : 0;         final int shelfWidth = mShelfWidth;         final int shelfHeight = mShelfHeight;         final int width = getWidth();         final int height = getHeight();         final Bitmap background = mShelfBackground;          for (int x = 0; x < width; x += shelfWidth) {             for (int y = top; y < height; y += shelfHeight) {                 canvas.drawBitmap(background, x, y, null);             }         }          if (count == 0) {             canvas.drawBitmap(mWebLeft, 0.0f, top + 1, null);             canvas.drawBitmap(mWebRight, width - mWebRightWidth, top + shelfHeight + 1, null);         }          super.dispatchDraw(canvas);     }            @Override     public void setPressed(boolean pressed) {         super.setPressed(pressed);          final Drawable current = getSelector().getCurrent();         if (current instanceof TransitionDrawable) {             if (pressed) {                 ((TransitionDrawable) current).startTransition(                         ViewConfiguration.getLongPressTimeout());             } else {                 ((TransitionDrawable) current).resetTransition();             }         }     } }
    

       

代码:

/**

* @author 张兴业
* 邮箱:
* android开发进阶群:278401545
*
*/