问题描述
我的目标是以编程方式创建 TextView 小部件并将其添加到 ConstraintLayout,相对于另一个小部件以不同角度围绕圆形定位,即使用圆形布局约束。
在我的 activity.xml 中,我添加了一个以布局居中的 TextView txtCentred
,以及一个使用圆形约束相对于此定位的 TextView txtPositioned
。
在运行时,我将新的 TextView 小部件添加到视图中。对于每个新的小部件,我复制 txtPositioned.LayoutParams
,修改副本的 circleAngle 字段,并在新的 TextView 上设置副本
我得到的结果是所有的 TextView 都被定位在同一个地方,就好像它们是使用我创建的最后一个 LayoutParams
定位的。它们的大小也都使用我添加的最后一个 TextView 的大小。看起来即使 LayoutParams 是单独的副本,它们也都链接到幕后的某个单一对象。
我注意到的一件事是所有不同的 LayoutParams 对象的“ConstraintWidget”都具有相同的哈希码。但也许这只是 txtCentred 小部件?
在模拟器中运行的应用的屏幕截图,显示了位于同一位置的所有小部件:
清单 xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:id="@+id/parentLayout">
<TextView
android:id="@+id/txtCentred"
android:text="X"
android:layout_width="wrap_content" android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="parent"/>
<TextView
android:id="@+id/txtPositioned"
android:text="R"
android:layout_width="wrap_content" android:layout_height="wrap_content"
app:layout_constraintCircle="@id/txtCentred"
app:layout_constraintCircleRadius="80dp"
app:layout_constraintCircleAngle="10"
android:fontFamily="sans-serif-black"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>
活动类
package com.example.myapplication
import android.graphics.Color
import android.os.Build
import android.os.Bundle
import android.view.View
import android.widget.TextView
import androidx.annotation.RequiresApi
import androidx.appcompat.app.AppCompatActivity
import androidx.constraintlayout.widget.ConstraintLayout
class MainActivity : AppCompatActivity() {
// Add a TextView,circular positioning
@RequiresApi(Build.VERSION_CODES.M)
fun AddTextView(text: String,atangle: Float,parent: ConstraintLayout,layoutParamsSource: TextView):TextView {
var newWidget = TextView(this)
parent.addView(newWidget)
newWidget.setTextAppearance(R.style.TextAppearance_AppCompat_Large)
var layoutParamscopy =
ConstraintLayout.LayoutParams(layoutParamsSource.layoutParams as ConstraintLayout.LayoutParams)
layoutParamscopy.circleAngle = atangle
newWidget.layoutParams = layoutParamscopy
newWidget.setText(text)
newWidget.scaleX = 5.0F
newWidget.scaleY = 5.0F
return newWidget
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
var parentLayout = findViewById<View>(R.id.parentLayout) as ConstraintLayout
var txtPositioned = findViewById<View>(R.id.txtPositioned) as TextView;
// add 4 TextViews in cardinal directions relative to txtCentred
var o = AddTextView("O",0.0F,parentLayout,txtPositioned)
o.setTextColor(Color.parseColor("#80ff0000"))
var k = AddTextView("K",90.0F,txtPositioned)
k.setTextColor(Color.parseColor("#8000ff00"))
k.scaleX = 5.0F
var a = AddTextView("A",180.0F,txtPositioned)
a.setTextColor(Color.parseColor("#800000ff"))
a.scaleX = 5.0F
var y = AddTextView("Y",270.0F,txtPositioned)
y.setTextColor(Color.parseColor("#80ff8000"))
y.scaleX = 5.0F
Log.d("d","o=${(o.layoutParams as ConstraintLayout.LayoutParams).circleAngle}")
Log.d("d","k=${(k.layoutParams as ConstraintLayout.LayoutParams).circleAngle}")
Log.d("d","a=${(a.layoutParams as ConstraintLayout.LayoutParams).circleAngle}")
Log.d("d","y=${(y.layoutParams as ConstraintLayout.LayoutParams).circleAngle}")
}
}
LogCat 调试输出显示每个小部件的不同 circleAngle 值:
2021-07-10 15:16:10.569 29143-29143/com.example.myapplication D/d: o=0.0
2021-07-10 15:16:10.569 29143-29143/com.example.myapplication D/d: k=90.0
2021-07-10 15:16:10.569 29143-29143/com.example.myapplication D/d: a=180.0
2021-07-10 15:16:10.569 29143-29143/com.example.myapplication D/d: y=270.0
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)