Как мне переместить пользовательский вид через весь макет приложения для Android? - PullRequest
0 голосов
/ 27 ноября 2018

Я пытаюсь переместить пользовательский вид (маленький кружок) по всему макету приложения, используя пропорциональные значения x и y.Скажем, например, что я хочу переместить окружность точно в середину экрана, поэтому я отправлю (0.5f, 0.5f), а затем умножу каждое значение на мои текущие ширину и высоту экрана соответственно.Но по какой-то причине круг заканчивается где-то еще, например (0,5, 0,5) и заканчивается в правом нижнем углу экрана, точно так же, как если бы я использовал неправильные и большие значения разрешения, а я нет, так как я дажежестко запрограммировав разрешение моего устройства, чтобы убедиться, что это не проблема.

Вот мой текущий вид реализации:

class CirclePointer(context: Context, attrs: AttributeSet) :View(context, attrs){

 override fun onDraw(canvas: Canvas?) {
     super.onDraw(canvas)

     canvas.apply {
         this!!.drawCircle(x, y, 5f, mCirclePointerPaint)
     }
 }

 private val mCirclePointerPaint = Paint().apply {
 }

 fun move(newX: Float, newY: Float){
     x = newX * 1280// hardcoded width
     y = newY * 720// hardcoded height

     invalidate()
     requestLayout()
 }// end of move

 override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
     super.onSizeChanged(w, h, oldw, oldh)
 }

}

И моя активность xml:

<?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/heading"
    android:orientation="vertical">

    <my.package.annotation_views.CirclePointer
    android:id="@+id/circlePointer"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

</RelativeLayout>

IЯ только что понял, как реализовать свой собственный вид, так что я почти уверен, что что-то упустил.Поэтому любая помощь будет принята.

То, что я пробовал

  • Установка ширины и высоты моего CirclePointer для match_parent вместо wrap_content

Наблюдения

Я использую Android Studio 3.2 и macOS Mojave

Заранее спасибо.

1 Ответ

0 голосов
/ 27 ноября 2018

Создание x и y круга в половине ширины и высоты экрана соответственно не будет работать, потому что x и y вашего круга - это верхний левый угол вашего круга, а не центр круга.Решение состоит в том, чтобы вычесть половину ширины из x и половину высоты из y, например:

int left = screenWidth / 2 - circleWidth / 2
int top = screenHeight / 2 - circleHeight / 2
yourCircle.setX(left);
yourCircle.setY(top);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...