'Basic Android Studio surfaceView code only works for old devices

So i was trying to make a simple mobile game for a school project. I setted up a simple SurfaceView thing and builded it on my phone with Android 12 (Api 32), but it doesn't draw anything. It enters the draw function of the view, but i can't see an output. It only works on a old friend's tablet with Android 4.4.2.

MySurfaceView.java

package com.example.lyceumgame;

import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback {
    Bitmap image;
    Paint paint;
    float iX, iY, tX = 0, tY = 0;
    float dx = 0, dy = 0;
    Resources res;
    MyThread myThread;

    float ws, hs;
    float iw, ih;
    boolean isFirstDraw = true;

    public MySurfaceView(Context context) {
        super(context);
        getHolder().addCallback(this);
        res = getResources();
        iX = 100;
        iY = 100;
        paint = new Paint();
        paint.setColor(Color.YELLOW);
        paint.setStrokeWidth(5);
        setAlpha(0);
    }

    @Override
    public void surfaceCreated(SurfaceHolder surfaceHolder) {
        myThread = new MyThread(surfaceHolder, this);
        myThread.setRunning(true);
        myThread.start();
    }

    @Override
    public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
        boolean retry = true;
        myThread.setRunning(false);
        while (retry) {
            try {
                myThread.join();
                retry = false;
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    public void draw(Canvas canvas) {
        super.draw(canvas);
        setAlpha(0);
        if (isFirstDraw){
            ws = canvas.getWidth();
            hs = canvas.getHeight();
            isFirstDraw = false;
        }
        canvas.drawRGB(0,255,0);
        canvas.drawLine(iX, iY, tX, tY, paint);
        if(tX != 0)
             delta();
        iX += dx;
        iY += dy;
        checkScreen();
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        tX = event.getX();
        tY = event.getY();
        delta();
        return true;
    }

    void delta(){
        double ro = Math.sqrt(Math.pow(tX-iX, 2)+Math.pow(tY-iY, 2));
        double k = 10;
        dx = (float) (k * (tX - iX)/ro);
        dy = (float) (k * (tY - iY)/ro);
    }

    private void checkScreen(){
        if(iY + ih >= hs && iY <= 0)
            dy = -dy;
        if(iX + iw >= ws && iX <= 0)
            dx = -dx;
    }
}

MyThread.java

package com.example.lyceumgame;


import android.graphics.Canvas;
import android.view.SurfaceHolder;

public class MyThread extends Thread {
    boolean isRunning = false;
    SurfaceHolder surfaceHolder;
    MySurfaceView mySurfaceView;
    long prevTime, nowTime;
    int FPS=60;
    int c=1000;
    int koeff=c/FPS;


    public MyThread(SurfaceHolder holder, MySurfaceView surfaceView) {
        surfaceHolder = holder;
        mySurfaceView = surfaceView;
        prevTime = System.currentTimeMillis();
    }

    @Override
    public void run() {
        Canvas canvas;
        while (isRunning){
            if(!surfaceHolder.getSurface().isValid())
                continue;
            canvas = null;
            nowTime = System.currentTimeMillis();
            long ellapsedTime = nowTime - prevTime;
            if(ellapsedTime > koeff){
                prevTime = nowTime;
                canvas = surfaceHolder.lockCanvas(null);
                synchronized (surfaceHolder){
                    mySurfaceView.draw(canvas);
                }
                if (canvas != null){
                    surfaceHolder.unlockCanvasAndPost(canvas);
                }
            }
        }
    }
    void setRunning(boolean f){
        isRunning = f;
    }
}

MainActivity.java

package com.example.lyceumgame;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new MySurfaceView(this));
    }
}

My SDK was in different location and code like this worked fine. I tried invalidating caches and moving SDK to previous location. It didn't work.



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source