【问题标题】:RemoteView setLayoutParams - Change ImageView Size Inside HomeScreen WidgetRemoteView setLayoutParams - 更改 HomeScreen 小部件内的 ImageView 大小
【发布时间】:2015-04-11 01:36:53
【问题描述】:

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

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

如何更改 Widget 中 ImageView 的大小?

目前,ImageViews 是使用 xml 文件中设置的大小创建的。如何使用其他尺寸实现重绘?

我认为这里没有太多代码可以发布,但如有必要,我很乐意这样做,如果您知道哪些代码可以在这里提供帮助,请告诉我。

我不想做的事:

  • 调整整个小部件的大小

  • 创建大量布局文件以根据 iconSize 进行切换

一些代码:

这就是我在我的活动中将 ImageView 大小设置为小部件预览的方式。 icons是一个ImageViews数组,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);
}

【问题讨论】:

  • 让我们假设您不是在应用小部件中执行此操作,而是在活动或片段中执行此操作。 iconSize 究竟会控制什么?你会在android:layout_widthandroid:layout_height 设置为wrap_content 的情况下拉入不同大小的不同图标吗?您会使用相同的图标,但使用android:layout_widthandroid:layout_height 来控制大小吗?你会做别的事吗?这将有助于我们将您所寻求的效果形象化。
  • @CommonsWare 我编辑了我的问题并添加了代码,以显示活动内部小部件预览中发生的情况。
  • 是的,好吧,这就是我害怕的。除了通过构造函数中的初始加载之外,我不知道有什么方法可以影响RemoteViews 中的LayoutParams
  • @CommonsWare 我找到了一个解决方法,它可能对你也很有趣。

标签: android imageview remoteview


【解决方案1】:

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

简单地使用

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

(视图 = RemoteViews)

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

它也可以在没有的情况下工作,但我认为添加它不会有坏处

android:cropToPadding="true"

如果您使用此方法,则归因于 ImageViews。

编辑:

我忘了提到在设置填充后的某个时间点你应该更新小部件(当用户退出应用程序以查看小部件时,我在 onPause() 中执行此操作)。 在 Activity 中使用 setPadding() 也会导致在视图上不调用 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);
    }

});

【讨论】:

  • 请记住,您正在更改图像的大小,而不是按钮的大小。这不是您要求的(“我想让用户有可能......自定义这些按钮的大小”)。不过,如果这能满足您的需求,那就太好了。
  • @CommonsWare 没错,实际上我只想让图像变小,但按钮保持原样。我将在我的问题中纠正这一点。再次感谢!
猜你喜欢
  • 1970-01-01
  • 2015-03-10
  • 2014-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-01
相关资源
最近更新 更多