Android UI开发第二十三篇——分享书架UI实现

本文介绍了一种在Android应用中实现仿真实书架的方法,通过自定义ShelvesView组件,利用Bitmap绘制背景和书架网格,实现了独特的UI效果。

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

    

       


代码:http://download.youkuaiyun.com/detail/xyz_lmn/4698124






     本文转自xyz_lmn51CTO博客,原文链接:http://blog.51cto.com/xyzlmn/1230767,如需转载请自行联系原作者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值