RemoteView setLayoutParams - 在HomeScreen小部件中更改ImageView大小

时间:2015-04-08 22:38:43

标签: android imageview remoteview

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

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

如何在窗口小部件中更改ImageView的大小?

现在,使用xml文件中设置的大小创建ImageView。如何以其他尺寸重绘?

我认为此处发布的代码不多,但我很乐意在必要时这样做,只要告诉我您是否知道代码可以提供哪些帮助。

我不想做的事情:

  • 调整整个小部件的大小

  • 根据iconSize

  • 创建大量要切换的布局文件

部分代码:

这就是我将活动中的ImageView大小设置为窗口小部件的预览。 icons 是一个ImageViews数组,progress是指用于选择 iconSize 的ProgressBar。

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);
}

1 个答案:

答案 0 :(得分:4)

我找到了一个小解决方法:

只需使用

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

(views = RemoteViews)

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

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

不会有害
android:cropToPadding="true"
如果使用此方法,

属性为ImageViews。

修改

我忘了提到在设置填充之后的某个时刻你应该更新小部件(当用户退出应用程序查看小部件时,我会在 onPause()中进行更新)。 在活动中使用 setPadding()也会导致无法调用View上的 invalidate(),以强制重绘/更新它。

这里有更多代码:

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);
    }

});