我正在尝试通过使用比例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>
我只是学习了如何实现自己的自定义视图,因此我很确定自己缺少一些东西。因此,我们将不胜感激。
我尝试过的事情
观察
我正在使用Android Studio 3.2和macOS Mojave
谢谢。
答案 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);