[英]How to pass parameters in Android drawable
如何在 android drawable 中传递 arguments。
如何实现下面提到的代码
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<solid android:color="{colorcode}" />
<stroke android:width="1sp" android:color="{colorcode}" />
<corners android:radius="15dp" />
</shape>
</item>
</selector>
然后从 XML 文件中获取这个可绘制的参数传递值。 就像是
<TextView
android:layout_width="wrap_content"
android:layout_height="50dp"
android:layout_marginRight="5dp"
android:layout_weight="1"
android:background="@drawable/rounded,{colorCode}"
android:gravity="center"/>
您可以使用数据绑定和 BindingAdapter 来完成。 我将展示一个使用 Kotlin 的示例。
apply plugin: 'kotlin-kapt' // only need when You use Kotlin
...
android {
...
buildFeatures {
dataBinding = true
}
...
}
import android.graphics.drawable.GradientDrawable
import android.os.Bundle
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat
import androidx.databinding.BindingAdapter
import androidx.databinding.DataBindingUtil
import com.myniprojects.teststackjava.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity()
{
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?)
{
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(
this, R.layout.activity_main)
}
}
// Here is binding adapter. It takes 2 colors, background and stroke. If You want more customization add more parameters
@BindingAdapter(value = ["colorStoke", "colorBack"], requireAll = true)
fun setBackground(textView: TextView, @ColorRes colorStoke: Int, @ColorRes colorBack: Int)
{
val stroke = ContextCompat.getColor(textView.context, colorStoke)
val back = ContextCompat.getColor(textView.context, colorBack)
val gd = GradientDrawable()
// setting background
gd.colors = intArrayOf(
back,
back
)
// here change parameters as You want
gd.gradientType = GradientDrawable.LINEAR_GRADIENT
gd.shape = GradientDrawable.RECTANGLE
gd.cornerRadius = 15f;
// setting stroke width and color
gd.setStroke(5, stroke)
textView.background = gd
}
要自定义 GradeintDrawable 检查此文档
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<import type="com.myniprojects.teststackjava.R" />
</data>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/txtVTest"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="20dp"
android:gravity="center"
android:text="TextView Text"
android:textSize="40sp"
app:colorBack="@{R.color.color_back}"
app:colorStoke="@{R.color.color_stroke}"/>
</FrameLayout>
</layout>
我正在导入R
以便能够传递资源。 (也许还有另一种没有导入的方法,但我不能像@{@color/name}
那样传递颜色,所以我只导入它)。 在您的TextView
中,您必须使用 colors 调用app:colorBack
和app:colorStoke
,您希望将其设置为中风和后退。
<color name="color_stroke">#B71C1C</color>
<color name="color_back">#33691E</color>
要生成ActivityMainBinding
您首先必须创建一个数据绑定布局。 如果您正确添加了您的依赖项以快速将您的布局转换为数据绑定布局,请使用: Alt + Enter
➡ Convert to data binding layout
*
所以你的布局应该是这样的:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
</data>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
</FrameLayout>
</layout>
现在重建您的项目后,您应该获得ActivityMainBinding
class。
ShapeDrawable 、 GradientDrawable和ColorDrawable是Drawable的直接子类。 您可以将您的可绘制对象显式转换为上述任何子类以调用方法/属性访问,例如setColor(int)
、 .paint
,如下所示:
val drawable: Drawable = (yourDrawable as StateListDrawable).getStateDrawable(0)
when (drawable) {
is ShapeDrawable -> {
(drawable as ShapeDrawable).paint.color = ContextCompat.getColor(mContext, R.color.colorToSet)
}
is GradientDrawable -> {
(drawable as GradientDrawable).setColor(ContextCompat.getColor(mContext, R.color.colorToSet))
(drawable as GradientDrawable).cornerRadius = 2.0F
}
is ColorDrawable -> {
(drawable as ColorDrawable).color = ContextCompat.getColor(mContext, R.color.colorToSet)
}
}
需要注意的点:
您可以在此可绘制对象上使用mutate()
,因为它返回与复制的常量可绘制对象 state 相同的可绘制对象实例。 mutate()方法不与任何其他可绘制对象共享其 state,因此如果您想保持可绘制对象原样然后在许多地方以不同状态使用它,这将非常有帮助。 这是关于如何在可绘制和保存状态上使用 mutate 的一个很好的答案。
此外,正如您在评论中提到的,要更改可绘制半径,请使用cornerRadii ,根据给定嵌入式链接中的文档,它会返回 4 个角中每个角的半径。 对于每个角,数组包含 2 个值[X_radius, Y_radius]
。 角的顺序是top-left
、 top-right
、 bottom-right
、 bottom-left
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.