【问题标题】:Android - Resize parent and child view using layoutparamsAndroid - 使用 layoutparams 调整父视图和子视图的大小
【发布时间】:2013-03-24 16:00:37
【问题描述】:

您好,我有一个可以调整大小的自定义视图,并且该视图中有很多子视图

我想问的是如何使用布局参数一起调整父母和孩子的大小?怎么做?我已经尝试使用view.getWidthview.getHeight 来获取视图的宽度,但它总是返回零,所以我无法缩放它,如何调整子视图的大小与父视图相同?

我希望我的问题足够清楚,但如果您需要其他解释,请在评论中留下,我会编辑我的问题。

谢谢

【问题讨论】:

  • 你是说要增加父视图的边界,让子视图按比例增长?就像父级是 100x100 而子级是 300x300 图像一样,当您增加父级边界时,子级图像的大小会增大以填充父级?
  • @BrettDuncavage 是的类似的东西,比如如果我的父尺寸是 1000x1000 dip 并且孩子是 300x300dip 图像,当我将父母缩放为 1.5 时,父尺寸填充为 1500x1500dip 并且子尺寸将是 450x450dip 有可能吗?谢谢
  • 好吧,在不知道您的布局代码是什么样子的情况下,我的猜测是,将您孩子 ImageViewandroid:scaleType 属性设置为 centerInside 可能会起作用(请参阅:developer.android.com/reference/android/widget/…)所以当父母的界限改变孩子的界限会改变,图像会缩放。这是假设您没有使用ImageView 宽度和高度的绝对值。
  • @BrettDuncavage 啊抱歉我忘了说我的布局是一个线性布局,里面有很多线性布局:)

标签: android android-layout zooming android-view layoutparams


【解决方案1】:
private void resizeChildren(ViewGroup parent, int newWidth, int newHeight) {
    // size is in pixels so make sure you have taken device display density into account
    int childCount = parent.getChildCount();
    for(int i = 0; i < childCount; i++) {
        View v = parent.getChildAtIndex(i);
        if (v instanceof ViewGroup) {
            ((ViewGroup)v).LayoutParams = new ViewGroup.LayoutParams(newWidth, newHeight);
        }
    }
}

当父级的边界发生变化时调用上述方法,并将父级传递给它。所有ViewGroup 类型的子级都将调整大小。如果需要,您也可以在每个孩子身上递归地调用它。调整子项的大小后,您可能需要在父项上调用 requestLayout()

【讨论】:

  • 好的,布雷特,谢谢你的想法!甚至你的代码也没有完全工作,但我明白了,谢谢!
  • 如果你给我更多信息,比如发布你的布局代码,我可以调整这个答案,使其更完整。
  • 啊,由于有很多自定义视图,代码相当复杂,所以我将代码发布在要点中 -> gist.github.com/NAYOSO/5303055 如果您有时间请看一下我现在遇到的问题是维护子视图的纵横比相同,现在每个子视图的大小在缩放时会有所不同,谢谢
【解决方案2】:

使用此代码,您可以使用 LayoutParams 调整父级和子级的大小 ...

LinearLayout header;
LinearLayout.LayoutParams headerParam;

header = (LinearLayout) findViewById(R.id.topheaderimage);
headerParam = new LinearLayout.LayoutParams(200, 100);
TextView headertext = (TextView) findViewById(R.id.text);
header.addView(headerimage, headerParam);

【讨论】:

  • 啊抱歉,我正在以编程方式添加孩子,而且我有很多孩子,你怎么看?为每个孩子生成并设置一个唯一的 ID?
  • 您可以使用ViewGroup.getChildCount()ViewGroup.getChildAt(index) 方法遍历整个视图层次结构。所以不需要findViewById() 电话。只需枚举父级的所有子级并调整它们的大小。
  • @BrettDuncavage 啊你给我一个新主意!您为什么不创建自己的答案,如果可行,我可以投票并接受您的答案?谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-14
  • 2014-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-18
相关资源
最近更新 更多