#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??