background scrolling with item in gridview

后端 未结 3 1425
执念已碎
执念已碎 2020-12-10 09:48

How do I implement background scrolling with a gridview? If it sounds vague, I mean like implementing a bookshelf using a gridview where the shelf image is attached to an it

3条回答
  •  自闭症患者
    2020-12-10 10:28

    It took me forever to figure this out, so for everybody trying to do this, here's the code from my e-book reader.

    It's based on Shelves by Romain Guy so he deserves the credit for the original code.

    package net.nightwhistler.pageturner.view;
    
    import net.nightwhistler.pageturner.R;
    import net.nightwhistler.pageturner.library.LibraryBook;
    import net.nightwhistler.pageturner.library.QueryResult;
    import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.Canvas;
    import android.graphics.Rect;
    import android.util.AttributeSet;
    import android.view.KeyEvent;
    import android.widget.GridView;
    
    public class BookCaseView extends GridView {
    
        private Bitmap background;
    
        private int mShelfWidth;
        private int mShelfHeight;   
    
        private QueryResult result;    
    
        private LibraryBook selectedBook;   
    
        public BookCaseView(Context context, AttributeSet attributes) {
            super(context, attributes);
    
            this.setFocusableInTouchMode(true);
            this.setClickable(false);
    
            final Bitmap shelfBackground = BitmapFactory.decodeResource(context.getResources(),
                    R.drawable.shelf_single);
            setBackground(shelfBackground);
            this.setFocusable(true);
        }
    
        public void setBackground(Bitmap background) {
            this.background = background;
    
            mShelfWidth = background.getWidth();
            mShelfHeight = background.getHeight();
        }   
    
        protected void onClick( int bookIndex ) {
            LibraryBook book = this.result.getItemAt(bookIndex);
    
            this.selectedBook = book;
            invalidate();
        }
    
        @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 = this.background;
    
            for (int x = 0; x < width; x += shelfWidth) {
                for (int y = top; y < height; y += shelfHeight) {
                    canvas.drawBitmap(background, x, y, null);
                }
    
                //This draws the top pixels of the shelf above the current one
    
                Rect source = new Rect(0, mShelfHeight - top, mShelfWidth, mShelfHeight);
                Rect dest = new Rect(x, 0, x + mShelfWidth, top );              
    
                canvas.drawBitmap(background, source, dest, null);            
            }        
    
    
            super.dispatchDraw(canvas);
        }
    
        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event) {
            if ( keyCode == KeyEvent.KEYCODE_BACK && this.selectedBook != null ) {
                this.selectedBook = null;
                invalidate();
                return true;
            }
    
            return false;
        }   
    
    }
    

提交回复
热议问题