如何在android应用的整个布局中移动自定义视图?

时间:2018-11-27 01:37:38

标签: android view kotlin

我正在尝试通过使用比例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>

我只是学习了如何实现自己的自定义视图,因此我很确定自己缺少一些东西。因此,我们将不胜感激。

我尝试过的事情

  • 将CirclePointer的宽度和高度设置为match_parent而不是wrap_content

观察

我正在使用Android Studio 3.2和macOS Mojave

谢谢。

1 个答案:

答案 0 :(得分:0)

分别在屏幕宽度和高度的一半处使圆的x和y无效,因为圆的x和y是圆的左上角而不是圆的中心。解决方案是从x减去宽度的一半,从y减去高度的一半,例如:

int left = screenWidth / 2 - circleWidth / 2
int top = screenHeight / 2 - circleHeight / 2
yourCircle.setX(left);
yourCircle.setY(top);