グリッドビューでバックグラウンド スクロールを実装するにはどうすればよいですか? あいまいに聞こえる場合は、グリッドビュー内のアイテムに棚の画像が添付されているグリッドビューを使用して本棚を実装するようなものです。
21623 次
3 に答える
4
これを理解するのに私は永遠にかかったので、これを行おうとしているすべての人のために、ここに私の電子書籍リーダーからのコードがあります。
Romain GuyのShelvesに基づいているので、彼は元のコードのクレジットに値します。
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;
}
}
于 2012-03-18T10:13:58.317 に答える
1
私がしたことは、背景画像をn個のgridview列に分割し、gridview getViewメソッドで、グリッド内の位置に従ってビューの背景を追加することでした。それは完璧に機能しました。
コードが必要な場合は、質問してください。
于 2013-01-25T22:27:33.607 に答える
-1
私の以前の回答では、背景を追加するだけで、アイテムと一緒にスクロールできません。あなたが望むのはNightWhistlerの答えです:)質問を誤解して申し訳ありません。
于 2011-07-18T14:48:31.760 に答える