安卓画布滚动
Posted
技术标签:
【中文标题】安卓画布滚动【英文标题】:android canvas scroll 【发布时间】:2010-10-27 01:25:08 【问题描述】:我正在编写一个纸牌游戏应用程序。我使用画布在屏幕上绘制所有内容。有时一堆卡片会变大并延伸到屏幕底部以下。我想让画布可滚动,以便用户可以访问这些卡片。
主要活动
package com.maulinpathare.solitaire;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
public class Solitaire extends Activity
/** Called when the activity is first created. */
private Context mContext;
private GameView mG;
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
mContext = this;
setContentView(R.layout.main);
@Override
public boolean onCreateOptionsMenu(Menu menu)
boolean result = super.onCreateOptionsMenu(menu);
menu.add(0, 1, 0, R.string.newGame);
menu.add(0, 2, 0, R.string.exitGame);
return result;
@Override
public boolean onOptionsItemSelected(MenuItem item)
switch (item.getItemId())
case 1:
mG = new GameView(this);
setContentView(mG);
return true;
case 2:
finish();
return true;
return false;
//end class
GameView 类 这就是一切发生的地方 我已经删除了大部分游戏逻辑...
package com.maulinpathare.solitaire;
import java.util.Stack;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ScrollView;
public class GameView extends ScrollView implements OnTouchListener
private Deck mD;
private boolean mInit, mDone;
private Stack<Card> mPile1, mPile2, mPile3, mPile4, mPile5, mPile6, mPile7,
mOpenPile, mEndPile1, mEndPile2, mEndPile3, mEndPile4, mTemp;
private Canvas mCanvas;
private int mPile;
private boolean mPickUp, mVictory;
private Card mCard;
private final int mSpacing = 22;
private Paint rectPaint, wonPaint1, wonPaint2;
public GameView(Context context)
super(context);
//initialize everything needed for the game
@Override
protected void onDraw(Canvas canvas)
mCanvas = canvas;
if(mInit)
initialize();
mInit = false;
//draw stuff...
//end onDraw
public boolean onTouch(View v, MotionEvent event)
int eventAction = event.getAction();
int x = Math.round(event.getX());
int y = Math.round(event.getY());
switch(eventAction)
case MotionEvent.ACTION_DOWN:
//check if touch has happened on one of the card piles
break; //end case action_touch
case MotionEvent.ACTION_MOVE:
//if card touched move it
break; //end case action_move
case MotionEvent.ACTION_UP:
//check if legal move has been made
break; //end case action_up
//end switch(event)
invalidate();
return true;
//end onTouch
我应该在哪里以及如何实现屏幕滚动?我希望用户能够以他们想要滚动的方向在屏幕上滑动手指。
【问题讨论】:
这篇文章***.com/questions/2646028/…有一个覆盖onInterceptTouchEvent方法的例子。 【参考方案1】:参见 android.widget.Scroller 和 android.view.VelocityTracker。它们将让您实现自定义滚动视图。 此外,您可以将 Canvas 放入 ScrollView...
【讨论】:
是的,另一个论坛上的某个人也告诉我这样做。我现在已将我的 GameView 作为孩子添加到 ScrollView。滚动现在工作正常,但因为 ScrollView 吃掉了所有的触摸事件,与卡片的交互现在被破坏了。我试图弄清楚是否有某种方法可以让 ScrollView 只接受某些事件并将其余的传递给它的孩子。【参考方案2】:有趣的东西,我理解视图在 Android 中工作的方式是内部视图接收所有触摸事件,并且只有在内部视图的 onTouchEvent 返回 0 时,事件才会传递给包装视图(也就是说他们没有处理它)除非父视图拦截触摸事件。
我认为你需要覆盖 onInterceptTouchEvent;
ScrollView
您希望在比当前更多的情况下将被拦截的事件传递给子视图。
我发现查看源代码通常很有用,因为文档可能不完整。
抱歉,我无法提供更多帮助,希望您可以通过扩展视图找到答案。
Gav
【讨论】:
以上是关于安卓画布滚动的主要内容,如果未能解决你的问题,请参考以下文章