Я новичок и пытаюсь переписать java-код в Kotlin, используя холст, попробуйте написать круг. Но в результате я получаю только пустой экран на своем устройстве

#android #kotlin #android-canvas

Вопрос:

Это мой файл SplashScreen.kt:

 class SplashScreen(context: Context): View(context) {
    private var paint: Paint? = null
    private var cx : Float = 0.0f
    private var cy : Float = 0.0f
    private var radius : Float = 0.0f

    fun SplashScreen(context: Context) {
        val paint = Paint()
        paint.color = Color.GREEN
        paint.strokeWidth = 2.0f
        paint.isAntiAlias = true
        cx = 200f; cy = 200f; radius = 50.0f;
    }

    override fun onDraw(canvas: Canvas) {
        super.onDraw(canvas);
        if (paint != null) {
            canvas.drawCircle(cx,cy,radius,paint)
        }
    }
}
 

и это мой основной файл.kt:

 class MainActivity : AppCompatActivity() {
    private lateinit var splash : SplashScreen

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val splash = SplashScreen(this)
        splash.keepScreenOn = true
        setContentView(splash)
    }
}
 

Когда я запускаю свой код на своем устройстве, я получаю только белый пустой экран. Без всякого Круга.
Я пытаюсь вызвать ActivityMain ,а не SplashScreen, со всей его работой» Привет, мир».

Я не могу понять, что я здесь делаю не так.

Кто-нибудь может сказать мне, почему это просто приводит к пустому экрану?

Комментарии:

1. спасибо за редактирование

Ответ №1:

Проблема в том, что вы путаете себя с конструктором и другим методом с именем SplashScreen

Вы могли бы значительно упростить свой код, используя следующее:

 class SplashScreen(context: Context): View(context) {
    private val paint: Paint = Paint().apply {
        color = Color.GREEN
        strokeWidth = 2.0f
        isAntiAlias = true
    }
    private val cx : Float = 200.0f
    private val cy : Float = 200.0f
    private val radius : Float = 50.0f
    
    override fun onDraw(canvas: Canvas) {
        super.onDraw(canvas);
        canvas.drawCircle(cx,cy,radius,paint)
    }
}
 

Кроме того, вы можете создать дополнительный конструктор, позволяющий задавать значения

 class SplashScreen(context: Context): View(context) {
    private val paint: Paint = Paint().apply {
        color = Color.GREEN
        strokeWidth = 2.0f
        isAntiAlias = true
    }
    private var cx : Float = 0.0f
    private var cy : Float = 0.0f
    private var radius : Float = 0.0f

    constructor(context: Context, radius: Float, cx: Float, cy: Float) : this(context) {
        this.radius = radius
        this.cx = cx
        this.cy = cy
    }

    override fun onDraw(canvas: Canvas) {
        super.onDraw(canvas);
        canvas.drawCircle(cx,cy,radius,paint)
    }
}
 

Комментарии:

1. Спасибо, это решило мою проблему. Но я не понимаю, почему этот код работает, а код под ним не работает. Они выглядят спокойными, похожими

Ответ №2:

Я нашел проблему в вашем коде. Итак, вы сделали неправильный конструктор. вы должны заменить код конструктора. вы можете использовать ключевое слово конструктора. Вот так вот.

 class SplashScreen: View {
    private var paint: Paint? = null
    private var cx : Float = 0.0f
    private var cy : Float = 0.0f
    private var radius : Float = 0.0f


    //fun SplashScreen(context: Context) { // this is wrong
    constructor(context: Context) : super(context) { // this is correct.
        val paint = Paint()
        paint.color = Color.GREEN
        paint.strokeWidth = 2.0f
        paint.isAntiAlias = true
        cx = 200f; cy = 200f; radius = 50.0f;
    }

    override fun onDraw(canvas: Canvas) {
        super.onDraw(canvas);
        if (paint != null) {
            canvas.drawCircle(cx,cy,radius,paint)
        }
    }
}
 

Комментарии:

1. Вы бы не использовали super(context) здесь

2. Нет, мы можем использовать здесь супер(контекст). Пожалуйста, посмотрите сверху. Я изменил объявление класса. class SplashScreen: View {

3. Ах, я понимаю, тогда в этом случае имеет немного больше смысла использовать его в качестве основного конструктора. Но спасибо за разъяснение

4. Я пытаюсь изменить свой код на код выше, и я получаю белый экран без круга. Может быть, что-то не так с моей активностью.kt??