Android 安卓画布卷轴
我正在写一个纸牌应用程序。我用画布画屏幕上的所有东西。有时,一堆卡片会变大并延伸到屏幕底部以下。我想让画布可以滚动,以便用户可以访问这些卡 主要活动Android 安卓画布卷轴,android,Android,我正在写一个纸牌应用程序。我用画布画屏幕上的所有东西。有时,一堆卡片会变大并延伸到屏幕底部以下。我想让画布可以滚动,以便用户可以访问这些卡 主要活动 package com.maulinpathare.solitaire; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.view.Menu; import android.view.Menu
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
}
package com.maulinpathare.solitaire;
导入java.util.Stack;
导入android.content.Context;
导入android.graphics.Canvas;
导入android.graphics.Color;
导入android.graphics.Paint;
导入android.graphics.Rect;
导入android.view.MotionEvent;
导入android.view.view;
导入android.view.view.OnTouchListener;
导入android.widget.ScrollView;
公共类GameView扩展了ScrollView实现的OnTouchListener{
私人甲板mD;
私有布尔mInit,mDone;
专用堆栈mPile1、mPile2、mPile3、mPile4、mPile5、mPile6、mPile7、,
mOpenPile、修补桩1、修补桩2、修补桩3、修补桩4、mTemp;
私人帆布mCanvas;
私营企业;
私有布尔mPickUp,mVictory;
私人卡mCard;
专用最终int MSPACGE=22;
私人油漆,元彩1号,元彩2号;
公共游戏视图(上下文){
超级(上下文);
//初始化游戏所需的一切
}
@凌驾
受保护的void onDraw(画布){
mCanvas=画布;
如果(迷你){
初始化();
mInit=假;
}
//画东西。。。
}//结束恩德劳
公共布尔onTouch(视图v,运动事件){
int eventAction=event.getAction();
intx=Math.round(event.getX());
int y=Math.round(event.getY());
开关(事件操作){
case MotionEvent.ACTION\u DOWN:
//检查其中一个卡片堆上是否发生了接触
break;//结束案例操作\u touch
case MotionEvent.ACTION\u移动:
//如果卡碰了,移动它
break;//结束案例操作\u移动
case MotionEvent.ACTION\u UP:
//检查是否已采取合法行动
中断;//结束案例操作\u中断
}//结束开关(事件)
使无效();
返回true;
}//端到端
}
在哪里以及如何实现屏幕滚动?我希望用户能够将手指滑动到屏幕上想要滚动的方向。请参见android.widget.Scroller和android.view.VelocityTracker。它们将允许您实现自定义滚动视图。
另外,您可以将画布放在滚动视图中…有趣的东西,我理解视图在Android中工作的方式是,内部视图接收所有触摸事件,如果内部视图的onTouchEvent返回0(也就是说,它们没有处理它),则事件只传递给包装视图除非父视图截获触摸事件 我认为你需要覆盖onInterceptTouchEvent 您希望截获的事件在比当前更多的情况下传递给子视图 我发现查看源代码通常很有用,因为文档可能不完整 很抱歉,我帮不了你什么忙,希望你能通过扩展视图找到答案
Gav是的,另一个论坛上也有人叫我这么做。我现在已经将我的GameView作为孩子添加到ScrollView中。滚动现在可以正常工作了,但是因为滚动视图吃掉了所有的触摸事件,所以与卡片的交互现在中断了。我试图找出是否有某种方法可以让ScrollView只接受某些事件并将其余的传递给它的子级。