簡體   English   中英

Android:如何更改每個元素的 Drawable 資源的顏色?

[英]Android: How can I change the color of a Drawable resource per element?

編輯 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更改紅色。

保持相同的 xml 並使用以下代碼在運行時更改顏色。

val layerDrawable = resources.getDrawable(R.drawable.circle_progress_bar) as LayerDrawable

layerDrawable.getDrawable(0).setColorFilter(Color.parseColor("#FF03A9F4"), android.graphics.PorterDuff.Mode.SRC_IN) layerDrawable.getDrawable(1).setColorFilter(Color.parseColor("#FF8BC34A"), android.graphics.PorterDuff.Mode.SRC_IN)

progressBar.progressDrawable = layerDrawable

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM