фоновая прокрутка с элементом в gridview - PullRequest
0 голосов
/ 18 июля 2011

Как мне реализовать фоновую прокрутку с помощью gridview? Если это звучит расплывчато, я имею в виду реализацию книжной полки с использованием вида сетки, где изображение полки прикреплено к элементу в виде сетки.

Ответы [ 3 ]

4 голосов
/ 18 марта 2012

Мне потребовалось целую вечность, чтобы понять это, поэтому для всех, кто пытается это сделать, вот код из моей программы чтения электронных книг.

Он основан на полках Ромена Гая , поэтому он заслуживает похвалы за оригинальный код.

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<LibraryBook> 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;
    }   

}
1 голос
/ 26 января 2013

Что я сделал, так это разделил фоновое изображение на n столбцов сетки и в методе getView сетки вида добавил вид фона в соответствии с положением в сетке.Он работал отлично.

Если вам нужен код, просто спросите.

0 голосов
/ 18 июля 2011

Мой предыдущий ответ только добавляет фон, но не позволяет ему прокручивать элементы.что вы хотите, так это ответ NightWhistler :) Извините, что неверно истолковал вопрос.

...