gpt4 book ai didi

Android:如何更改每个元素的 Drawable 资源的颜色?

转载 作者:行者123 更新时间:2023-11-30 04:53:48 26 4
gpt4 key购买 nike

编辑 4/5:我的 getViewAt 函数现在是这样的,但仍然没有效果

    override fun getViewAt(position: Int): RemoteViews {
val v = (context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater)
.inflate(R.layout.widget_item, null)
.findViewById<ProgressBar>(R.id.progressBar)
.apply {
this.progressBackgroundTintList = ColorStateList.valueOf(0x00ff00)
this.progressTintList = ColorStateList.valueOf(0xffff00)
this.max = 100
this.progress = 0
this.isIndeterminate = false
this.progressDrawable = context.resources.getDrawable(R.drawable.circle_progress_bar, null)
}

val layer = context.resources.getDrawable(R.drawable.circle_progress_bar, null) as LayerDrawable
layer.getDrawable(0).setColorFilter(0x03a9f4, android.graphics.PorterDuff.Mode.SRC_IN)
layer.getDrawable(1).setColorFilter(0x8bc34a, android.graphics.PorterDuff.Mode.SRC_IN)

View.inflate(context, R.layout.widget_item, null)
.findViewById<ProgressBar>(R.id.progressBar)
.progressDrawable = layer


val r = RemoteViews(context.packageName, R.layout.widget_item).apply {
val event = MiniModel.events[position]

// setProgressBar(
// R.id.progressBar,
// event.totalDuration.toInt(unit = DurationUnit.SECONDS),
// event.timeRemaining.toInt(unit = DurationUnit.SECONDS),
// false
// )

reapply(context, v)

setTextViewText(R.id.item_text, event.title)

setTextViewText(R.id.details_text, if (event.isOver) "Event Complete" else "in " + event.timeRemaining.asPrettyString)
}

View.inflate(context, r.layoutId, null).findViewById<ProgressBar>(R.id.progressBar)
.apply {
this.progressBackgroundTintList = ColorStateList.valueOf(0x00ff00)
this.progressTintList = ColorStateList.valueOf(0xffff00)
this.max = 100
this.progress = 0
this.isIndeterminate = false
this.progressDrawable = context.resources.getDrawable(R.drawable.circle_progress_bar, null)
}

return r
}

我正在制作一个 Android 应用小部件,它是一个包含 n 行的 ListView。在每一行中,我都有一个自定义的圆形进度指示器,它有两种颜色;一张用于背景,一张用于前景。每行的进度指示器颜色不同,但基于相同的 Drawable 资源。

我的问题是,在设置/更新我的小部件时,如何更改每行中的进度指示器颜色?另一个挑战是我无法访问 findViewById,因为我使用 RemoteViewsFactory 构建了我的小部件。

@drawable/circle_progress_bar.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/background">
<shape
android:innerRadiusRatio="1000"
android:shape="ring"
android:thicknessRatio="10"
android:useLevel="false">
<solid android:color="#0000ff" /> <!-- I want this to be set programatically per widget row -->
</shape>
</item>
<item android:id="@android:id/progress">
<rotate
android:fromDegrees="270"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="270">
<shape
android:innerRadiusRatio="1000"
android:shape="ring"
android:thicknessRatio="10"
android:useLevel="true">
<solid android:color="#ff0000" /> <!-- this too -->
</shape>
</rotate>
</item>

</layer-list>

@layout/widget_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="80dp"
android:background="@drawable/shape"
android:gravity="center_vertical">

<ProgressBar
android:id="@+id/progressBar"
style="?android:attr/progressBarStyleHorizontal"
android:scaleX="2"
android:scaleY="2"
android:layout_width="100dp"
android:layout_height="60dp"
android:layout_weight="0"
android:indeterminate="false"
android:max="100"
android:progress="25"
android:progressDrawable="@drawable/circle_progress_bar" />
</LinearLayout>

EventWidgetService.kt

class EventWidgetService : RemoteViewsService() {
override fun onGetViewFactory(intent: Intent): RemoteViewsFactory =
EventRemoteViewsFactory(this.applicationContext, intent)
}

class EventRemoteViewsFactory(private val context: Context, intent: Intent) : RemoteViewsService.RemoteViewsFactory {
private val prefsName = "FlutterSharedPreferences"

override fun onCreate() {
MiniModel.initialize(context.getSharedPreferences(prefsName, Context.MODE_PRIVATE))
}

override fun getLoadingView(): RemoteViews = RemoteViews(context.packageName, R.id.emptyView)

override fun getItemId(position: Int): Long = position.toLong()

override fun onDataSetChanged() {
}

override fun hasStableIds(): Boolean = true

@ExperimentalTime
override fun getViewAt(position: Int): RemoteViews {
return RemoteViews(context.packageName, R.layout.widget_item).apply {
val event = MiniModel.events[position]

setProgressBar(
R.id.progressBar,
(event.end.epochSecond - event.start.epochSecond).toInt(),
event.secondsRemaining.toInt(unit = TimeUnit.SECONDS),
false
)

setTextViewText(R.id.item_text, event.title)

setTextViewText(R.id.details_text, if (event.isOver) "Event Complete" else "in " + event.secondsRemaining.asPrettyString)
}
}

override fun getCount(): Int = MiniModel.events.count()

override fun getViewTypeCount(): Int = 1

override fun onDestroy() {
}

}

编辑 1/2 摘要 反射不起作用

编辑 3: 在我的 getViewAt(Int): RemoteViews 函数中,我也尝试添加

View.inflate(context, R.layout.widget_item, null).findViewById<ProgressBar(R.id.progressBar).apply {
progressBackgroundTintList = ColorStateList.valueOf(0x00ff00)
progressTintList = ColorStateList.valueOf(0xffff00)
}

但是这没有任何效果。

最佳答案

使用 RemoteViews 的 setProgressBackgroundTintList 方法改变蓝色,使用 setProgressTintList 方法改变红色。

关于Android:如何更改每个元素的 Drawable 资源的颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59572748/

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