我的应用程序显示一个总共有8个按钮的小部件。我想让用户可以设置窗口小部件的样式,并自定义按钮下方的ImageViews的大小。 目的是保持按钮不变,但动态更改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);
}
答案 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);
}
});