Android UI开发第二十三篇——分享书架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://blog.csdn.net/xyz_lmn/article/details/8123929

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值