微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 Android Studio Activity 中设置布局和视图的内容?

如何解决如何在 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 举报,一经查实,本站将立刻删除。