RemoteView setLayoutParams - 在 HomeScreen Widget 中更改 ImageView 大小

RemoteView setLayoutParams - Change ImageView Size Inside HomeScreen Widget

我的应用程序显示了一个总共有 8 个按钮的小部件。我想让用户可以设置该小部件的样式并自定义按钮下方的 ImageView 的大小。 目的是让按钮保持原样,但动态更改 ImageView 大小。

为此,用户可以设置一个图标大小,它以整数形式存储在 SharedPreference 中 iconSize

如何更改 Widget 中 ImageView 的大小?

目前,ImageView 是使用 xml 文件中设置的大小创建的。我怎样才能用另一个尺寸实现重绘?

我假设此处 post 的代码不多,但如有必要,我很乐意这样做,如果您知道哪些代码可以帮助您,请告诉我。

我不想做的事:

一些代码:

这就是我在 activity 中将 ImageView 大小设置为小部件预览的方式。 icons是一个ImageView数组,progress指的是一个ProgressBar,用来选择iconSize.

for (ImageView icon : icons) {
    icon.requestLayout();

    // convert into actual Pixels
    progress = (int) TypedValue.applyDimension(
            TypedValue.COMPLEX_UNIT_PX,
            progress,
            getResources().getDisplayMetrics()
    );

    // set width and height
    icon.getLayoutParams().height = progress;
    icon.getLayoutParams().width = progress;

    sizeText.setText("" + progress);
}

这是我发现的一个小解决方法:

简单使用

views.setViewPadding(R.id.vieId, left, top, right, bottom);

(视图 = RemoteViews)

您只需要进行一些计算,以便 100%(最大可能大小)的 iconSize 等于 0 填充和 1% iconSize 等于最大填充。

没有它也能工作,但我认为添加

不会有什么坏处
android:cropToPadding="true"

如果使用此方法,请将属性添加到 ImageViews。

编辑:

我忘了提到在设置填充后的某个时候你应该更新小部件(我在 onPause() 当用户退出应用程序查看部件)。 在 activity 中使用 setPadding() 如果不在视图上调用 invalidate() 也会导致无处可去,以强制 redraw/update 其中。

这里有更多代码:

seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        // Map the values, 100 is the custom max of my seekBar
        // I am adding 1 to because the seekBar goes from 0-99,
        // but the size from 1% to 100%
        int iconSize  = 100 - (progress+1);

        for (ImageView icon : icons) {
            // set the padding
            icon.setPadding(iconSize, iconSize, iconSize, iconSize);

            // force the ImageView to redraw with the new padding, this
            // serves as a live preview of the icons' sizes.
            icon.invalidate();
        }
    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {
        // you might want to do something here
    }

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {
        // map the value
        int iconSize = 100 - (seekBar.getProgress()+1);

        // save it in your SharedPreferences or somewhere else
        Utils.setDefaultsInt(Con._ICONSIZE, iconSize, MainPage.this);
    }

});