如何解决如何在 Android Studio Activity 中设置布局和视图的内容?
我目前正在 Android Studio 中编写我的第一个 Java 游戏。我想对我的活动布局和我的游戏视图进行 setContentview。我想在屏幕上打印一些控件来移动我的角色,但我得到的只是屏幕上的 draw() 方法。
我的游戏活动
public class GameActivity extends AppCompatActivity {
private GameView gameView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getwindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
//setContentView(R.layout.activity_game);
gameView = new GameView(this);
setContentView(gameView);
}
@Override
protected void onPause() {
super.onPause();
gameView.pause();
}
@Override
protected void onResume() {
super.onResume();
gameView.resume();
}
}
我的游戏视图
public class GameView extends SurfaceView implements Runnable{
SurfaceHolder surfaceHolder;
String WALK_DIR = "";
private final long NS_perSec = 1000000000;
private int currentFrame = 0;
private static long FPS = 0;
private long timePassed;
public Bitmap character,arrow_up,arrow_down,arrow_left,arrow_right;
private Thread thread;
private boolean isPlaying;
private boolean isMoving = false;
private final float WALK_SPD = 100;
float startPositionX,startPositionY;
float arrowX = 45,arrowY = 30;
Paint paint;
//Sprite Animation
private int frameWidth = 100;
private int frameHeight = 400;
private int frameCount = 4;
public Rect frametoDraw = new Rect(
0,frameWidth,frameHeight/frameCount);
RectF wheretoDraw = new RectF(
0,startPositionX + frameWidth,frameHeight);
public static float screenRatioX,screenRatioY;
private long lastFrameChangeTime = 0l;
public GameView(Context context) {
super(context);
surfaceHolder = getHolder();
display display = ((Activity)context).getwindowManager().getDefaultdisplay();
Point size = new Point();
display.getSize(size);
screenRatioX = size.x;
screenRatioY = size.y;
startPositionX = screenRatioX/2 - frameWidth/2;
startPositionY = screenRatioY/2 - frameHeight/8;
paint = new Paint();
character = BitmapFactory.decodeResource(this.getResources(),R.drawable.character_sprite);
arrow_right = BitmapFactory.decodeResource(this.getResources(),R.drawable.arrow_right);
arrow_down = BitmapFactory.decodeResource(this.getResources(),R.drawable.arrow_down);
arrow_left = BitmapFactory.decodeResource(this.getResources(),R.drawable.arrow_left);
arrow_up = BitmapFactory.decodeResource(this.getResources(),R.drawable.arrow_up);
character = Bitmap.createScaledBitmap(character,frameWidth * frameCount,frameHeight,false);
arrow_right = Bitmap.createScaledBitmap(arrow_right,(int)arrowX,(int)arrowY,false);
arrow_down = Bitmap.createScaledBitmap(arrow_down,false);
arrow_left = Bitmap.createScaledBitmap(arrow_left,false);
arrow_up = Bitmap.createScaledBitmap(arrow_up,false);
}
@Override
public void run() {
isPlaying = true;
while (isPlaying){
long startLoop = System.nanoTime();
update();
draw();
sleep();
timePassed = System.nanoTime() - startLoop;
if(timePassed >= 1){
FPS = (long) (NS_perSec / timePassed);
}
}
}
private void update(){
if(isMoving) {
startPositionX = startPositionX + (WALK_SPD / FPS);
if (startPositionX > screenRatioX){
startPositionY += (int) frameHeight;
startPositionX = 10;
}
if (startPositionY + frameHeight > screenRatioY){
startPositionY = 10;
}
}
}
private void draw(){
if (surfaceHolder.getSurface().isValid()){
Canvas canvas = getHolder().lockCanvas();
canvas.drawColor(Color.WHITE);
// Choose the brush color for drawing
paint.setColor(Color.argb(255,249,129,0));
// Make the text a bit bigger
paint.setTextSize(45);
canvas.drawText("FPS:" + FPS,20,40,paint);
wheretoDraw.set((int)startPositionX,(int)startPositionY,(int)startPositionX + frameWidth,(int)startPositionY + frameHeight/frameCount);
getCurrentFrame();
canvas.drawBitmap(character,frametoDraw,wheretoDraw,paint);
surfaceHolder.unlockCanvasAndPost(canvas);
}
}
public void getCurrentFrame(){
long time = System.nanoTime();
if(isMoving) {
if ( time > lastFrameChangeTime + NS_perSec/10) {
lastFrameChangeTime = time;
currentFrame++;
if (currentFrame >= frameCount) {
currentFrame = 0;
}
}
frametoDraw.left = currentFrame * frameWidth;
frametoDraw.right = frametoDraw.left + frameWidth;
frametoDraw.top = 3 * frameHeight/4;
frametoDraw.bottom = frametoDraw.top + frameHeight/4;
}
}
private void sleep(){
try {
Thread.sleep(17);
} catch (InterruptedException e) {
e.printstacktrace();
}
}
public void resume(){
isPlaying = true;
thread = new Thread(this);
thread.start();
}
public void pause(){
isPlaying = false;
try {
thread.join();
} catch (InterruptedException e) {
e.printstacktrace();
Log.e("ERROR","Joining Thread");
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
//return super.onTouchEvent(event);
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
isMoving = true;
break;
case MotionEvent.ACTION_UP:
isMoving = false;
break;
}
return true;
}
}
游戏活动xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".GameActivity">
<ImageView
android:id="@+id/arrow_left"
android:layout_width="45dp"
android:layout_height="30dp"
android:translationZ="100dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.861"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.858"
app:srcCompat="@drawable/arrow_left" />
<ImageView
android:id="@+id/arrow_right"
android:layout_width="45dp"
android:layout_height="30dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.95"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.858"
app:srcCompat="@drawable/arrow_right" />
<ImageView
android:id="@+id/arrow_down"
android:layout_width="30dp"
android:layout_height="45dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.897"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.956"
app:srcCompat="@drawable/arrow_down" />
<ImageView
android:id="@+id/arrow_up"
android:layout_width="30dp"
android:layout_height="45dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.897"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.789"
app:srcCompat="@drawable/arrow_up" />
</androidx.constraintlayout.widget.ConstraintLayout>
What I got in my layout in game activity
What I get in my screen when I run the game
我希望控件位于屏幕的右下角。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。