现在的位置: 首页 > 综合 > 正文

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

2013年08月22日 ⁄ 综合 ⁄ 共 2778字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.