Ich schreibe eine Solitaire-App. Ich verwende eine Leinwand, um alles auf dem Bildschirm zu zeichnen. Manchmal wird ein Kartenstapel so groß, dass er unter den unteren Rand des Bildschirms reicht. Ich möchte die Leinwand scrollbar machen, damit der Benutzer auf diese Karten zugreifen kann.
Haupttätigkeit
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-Klasse Hier passiert alles Ich habe den größten Teil der Spiellogik entfernt...
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
}
Wo und wie sollte ich den Bildlauf implementieren? Ich möchte, dass der Benutzer mit dem Finger in die gewünschte Richtung über den Bildschirm gleiten kann.