0

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

class Map(context: Context) : View(context) {
    private var dynamicMap: Array<Array<Tail>>? = null
    private var lazyDynamicMap: Array<Array<Tail>>? = null
    private var viewMap: Bitmap? = null
    private var screenWidth: Int = 0
    private var screenHeight: Int = 0
    private var mapScaleFactor: Float = 1f
    private var lastScaleFactor: Float = 1f
    private var scaleGestureDetector: ScaleGestureDetector
init {
    scaleGestureDetector = ScaleGestureDetector(context, object : ScaleGestureDetector.SimpleOnScaleGestureListener() {
        override fun onScale(detector: ScaleGestureDetector): Boolean {
            mapScaleFactor *= detector.scaleFactor / lastScaleFactor
            lastScaleFactor = detector.scaleFactor
            invalidate()
            return true
        }

        override fun onScaleEnd(detector: ScaleGestureDetector) {
            lastScaleFactor = 1f
        }
    })

    // Получение инициализации viewMap из ресурсов
    viewMap = BitmapFactory.decodeResource(resources, R.drawable.img_bg_setting)

    // Получение ширины и высоты экрана
    val displayMetrics = resources.displayMetrics
    screenWidth = displayMetrics.widthPixels
    screenHeight = displayMetrics.heightPixels
}

override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec)
    val desiredWidth = MeasureSpec.getSize(widthMeasureSpec)
    val desiredHeight = MeasureSpec.getSize(heightMeasureSpec)
    setMeasuredDimension(desiredWidth, desiredHeight)
}

override fun onTouchEvent(event: MotionEvent): Boolean {
    scaleGestureDetector.onTouchEvent(event)
    return true
}

override fun onDraw(canvas: Canvas) {
    super.onDraw(canvas)
    viewMap?.let {
        val scaledWidth = it.width * mapScaleFactor
        val scaledHeight = it.height * mapScaleFactor
        val left = (width - scaledWidth) / 2
        val top = (height - scaledHeight) / 2
        canvas.drawBitmap(it, null, RectF(left, top, left + scaledWidth, top + scaledHeight), null)
    }
}

}

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=".###">
&lt;com.###.Map
    android:id=&quot;@+id/###&quot;
    android:layout_width=&quot;match_parent&quot;
    android:layout_height=&quot;wrap_content&quot;
    app:layout_constraintBottom_toBottomOf=&quot;parent&quot;
    app:layout_constraintEnd_toEndOf=&quot;parent&quot;
    app:layout_constraintStart_toStartOf=&quot;parent&quot;
    app:layout_constraintTop_toTopOf=&quot;parent&quot; /&gt;


</androidx.constraintlayout.widget.ConstraintLayout>

Заранее скажу, что среда не ругается на какие-либо красные ошибки. Разве что пишет вот это в XML-вёрстке: Missing classes

The following classes could not be found:
- com.###.Map (Fix Build Path, Edit XML, Create Class)
   Tip: Try to build the project.
   Tip: Try to refresh the layout.

Работаю через Android Studio. Gradle нормально проект собирает. Вместо ### - ID приложения, там тоже всё указано правильно. Карта будет собираться путём склеивания из тайлов из dynamicMap, lazyDynamicMap - будет хранить б`ольшую площадь, но после отрисовки основной.

Andrew
  • 17,943
  • 2
    Когда крашит - полагается смотреть в логи и если причина вам не понятна, то прикладывать лог ошибки к вопросу. Чтобы использовать свой класс в разметке нужно объявить конструктор с двумя параметрами View(context: Context!, attrs: AttributeSet?) - без него инфлейтер не может создать экземпляр этого класса. – woesss Jun 27 '23 at 19:59
  • @woesss, вот я не понял, где смотреть эти логи. – mister_svinia Jun 27 '23 at 20:05
  • Я вам ссылку дал на вопрос, где всё написано. В LogCat нужно смотреть: https://developer.android.com/studio/debug/logcat – woesss Jun 28 '23 at 06:05

1 Answers1

0

Ошибка оказалась не в том, что говорил @woesss. Но я и сам хорош, сказал что всё правильно остальное. Gradle при сборке не клонирует стили, а Android не позволяет одному стилю использоваться несколько раз. У меня же было наследование стиля. Я добавил ещё один персонально для этой активности и всё заработало.