使用setScaleX()setScaleY()更改android窗口大小

时间:2016-01-28 02:46:47

标签: android view android-windowmanager

我正在使用WindowManager添加视图。

WindowManager.LayoutParameters中我将宽度和高度都设置为WRAP_CONTENT,因为内容应该决定视图应该有多大。

但是,我允许用户调整布局的整体大小。

然后,当我创建布局时,我只是应用保存的比例值,中提琴显示新调整大小的视图。

问题在于,尽管缩放了我添加的实际视图,如下所示:

myView.setScaleX(scaleFactor);
myView.setScaleY(scaleFactor);
mWindowManager.addView(myView, params);

在我缩小的视野中似乎仍然存在某种“容器”。

所以我认为不是使用setScaleX()setScaleY(),而是在我的视图中添加一个runnable,以便在完成绘制并调用getWidth()getHeight()然后使用后运行我的scaleFactor值用于计算新的高度和宽度。这很有效,但现在事情正在逐渐消失,因为setScaleX()setScaleY()实际上缩小了视图中的所有。整个Paint对象缩小,包括文本,文本和所有内容之间的空间。

有谁知道如何使绝对尺寸与收缩视图的尺寸相同?

编辑:所以搞砸了这个。我认为我需要做的是弄清楚如何调整父布局的大小,并允许剪裁它们的子节点而不是调整大小。

例如:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:id="@+id/parent_layout"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin">

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"/>
</RelativeLayout>

在上面的布局中,我使用TextViewsetScaleX()缩放setScaleY()对象,这会导致textView缩放,但不会改变其实际尺寸。

我需要做的是获取RelativeLayout的尺寸并将其乘以浮动比例值。这将获得新的尺寸。然后我需要更新这些维度而不更改TextView对象的维度。

1 个答案:

答案 0 :(得分:2)

所以我想出了这个并发布了答案和代码。

使用setScaleX()setScaleY()时,会根据视图的中心对其进行缩放。这会导致视图的顶部和左侧位置缩小或增长,而不会更改视图的实际尺寸。

为了弥补这一点,我们必须采取子视图(textView1)并向左移动它,然后我们将它缩小了多少。

以下是执行此操作的代码:

RelativeLayout parent; //THis is the parent view that you added with a WindowManager object.
TextView textView1; //This is the child view of our parent. For this example, I am using a TextView.
float factor; //This is the amount we scaled our view by.
parent.post(new Runnable() { //When you post a runnable to a view, it runs after the view is drawn and measured.
    @Override
    public void run() {
        int newWidth = Math.round(parent.getWidth() * factor), newHeight = Math.round(parent.getHeight() * factor); //Calculate what the new height and width will be for the parent view to get resized to.
        WindowManager.LayoutParams pp = (WindowManager.LayoutParams)parent.getLayoutParams(); //Get an instance of the parent LayoutParams so we can set the new height and width measurements.
        RelativeLayout.LayoutParams ch = (RelativeLayout.LayoutParams)chatHead.getLayoutParams(); //Get the child's layout parameters so we can adjust the margins as needed.
        int diffX = parent.getWidth() - newWidth, diffY = parent.getHeight() - newHeight; //Calculate the difference in sizes from the newly scaled size to the old size.
        diffX = -Math.round(diffX / 2); //Calculate the amount of space needed to move the child view inside its parent. The negative sign is needed here depending how you calculate the differences.
        diffY = -Math.round(diffY / 2); //Same as above, but for the height.
        ch.setMargins(diffX, diffY, Integer.MIN_VALUE, Integer.MIN_VALUE); //Set the new margins for the child view. This will move it around so it is anchored at the top left of the parents view. 
        rootChatHead.updateViewLayout(chatHead, ch); //Apply the new parameters.
        pp.width = newWidth; //Set the parent's new width.
        pp.height = newHeight; //Set the parent's new height.
        windowManager.updateViewLayout(rootChatHead, pp); //Update the parent view.
}

现在我们的视图按比例缩小,容器的大小已经调整,以占用因缩放儿童视图而导致的任何额外空间。

如果您将子视图扩展得更高,此方法也可以使用。它将重新调整父母的大小以适应孩子的新大小。