gpt4 book ai didi

java - 用 subview 网格填充屏幕,但 subview 的大小是预期大小的一半

转载 作者:行者123 更新时间:2023-12-02 05:48:55 29 4
gpt4 key购买 nike

我正在编写一个可以在屏幕上拖动计数器的游戏。我想为每个计数器使用 ImageView subview ,并在 FrameLayout 父 View 内设置绝对位置。

我读过一些关于各种布局类相对于已弃用的 AbsoluteLayout 的优势的文章,并且我不想使用 RelativeLayout 因为计数器必须是彼此独立移动。这些帖子似乎都没有解决我遇到的特定问题,但如果有人能指出我遇到的具体问题,我会很高兴。

这是布局 XML:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_game"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ff808080">
</FrameLayout>

因为我不想对屏幕的大小做出假设,所以我在 onMeasure() 中将每个子项的大小设置为父项大小的一部分:

package uk.co.fractalmaze.counterspin.widget

import android.content.Context
import android.graphics.Color
import android.util.Log
import android.view.ViewGroup
import android.widget.FrameLayout
import android.widget.ImageView

class CounterView(context: Context, private val label: String, private val offset: Int) : ImageView(context)
{
init
{
// Set the background color.
val color = if (offset > 0) Color.GREEN else Color.RED
setBackgroundColor(color)
}

override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int)
{
// Set the position and size.
val parentWidth = MeasureSpec.getSize(widthMeasureSpec)
val parentHeight = MeasureSpec.getSize(heightMeasureSpec)
val size = Math.min(parentWidth, parentHeight) / 2
val left = offset * size
Log.i(javaClass.simpleName, "Parent size ($parentWidth, $parentHeight) to $label child position ($left, 0) size $size")
setMeasuredDimension(size, size)
layoutParams = createLayoutParams(left, 0, size, size)
}

private fun createLayoutParams(left: Int, top: Int, width: Int, height: Int): ViewGroup.LayoutParams
{
// Create a margin params object.
val params = FrameLayout.LayoutParams(width, height)
params.leftMargin = left
params.topMargin = top
return params
}
}

为了完整起见,我将 subview 添加到父 View 中:

package uk.co.fractalmaze.counterspin.activity

import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.widget.FrameLayout
import uk.co.fractalmaze.counterspin.R
import uk.co.fractalmaze.counterspin.widget.CounterView

class GameActivity : AppCompatActivity()
{
override fun onCreate(savedInstanceState: Bundle?)
{
// Call the superclass.
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_game)

// Add a left and right view to the group.
val group = findViewById<FrameLayout>(R.id.activity_game)
group.addView(CounterView(applicationContext, "left", 0))
group.addView(CounterView(applicationContext, "right", 1))
}
}

这是结果的屏幕截图:

enter image description here

我希望红色和绿色的 subview 并排出现并填满屏幕,但它们加在一起只占据宽度的一半。 logcat 输出证实了这一点,其中显示 MeasureSpec 解码的父宽度为 1080,然后为 540,导致子宽度为 540,然后为 270。这是在模拟 Pixel 3 上运行的,其屏幕为 1080 像素宽度:

2019-05-09 22:06:33.493 15575-15575/uk.co.fractalmaze.counterspin I/CounterView: Parent size (1080, 1808) to left child position (0, 0) size 540
2019-05-09 22:06:33.493 15575-15575/uk.co.fractalmaze.counterspin I/CounterView: Parent size (1080, 1808) to right child position (540, 0) size 540
2019-05-09 22:06:33.560 15575-15575/uk.co.fractalmaze.counterspin I/CounterView: Parent size (540, 540) to left child position (0, 0) size 270
2019-05-09 22:06:33.561 15575-15575/uk.co.fractalmaze.counterspin I/CounterView: Parent size (540, 540) to right child position (270, 0) size 270

谁能告诉我:

  1. 为什么父 View 将自身大小调整为宽度 540?
  2. 如何让 subview 填满整个 1080 像素?

最佳答案

使用LinearLayout而不是FrameLayout,例如:

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:weightSum="2">

<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="#ff0000">
<!--child 1-->
</LinearLayout>

<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="#00ff00">
<!--child 2-->
</LinearLayout>

</LinearLayout>

关于java - 用 subview 网格填充屏幕,但 subview 的大小是预期大小的一半,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56067898/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com