从右侧或左侧增加LinearLayout宽度

时间:2017-07-22 17:07:34

标签: android width android-linearlayout

我有一个以屏幕为中心的LinearLayout。它的宽度小于屏幕宽度。有两个按钮:右箭头和左箭头。 当用户按下相关按钮时,布局应从相关侧增加其宽度。另一方应保持其在那里的位置。

现在设置宽度会增加两侧的布局。布局需要最初居中,并且必须通过用户的输入从任一侧扩展。 (用例是找到左右两边有不相等边框的图像相关部分的宽度,因此用户必须使用我的技术标记它们。)

我使用以下来增加宽度,但它具有上述行为。

ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) 
                                      llCropOverlay.getLayoutParams();
params.width = params.width + 1;

PS:此功能自早期开始在Tasker应用程序中实现;所以有可能。

编辑: 这是布局。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    android:orientation="vertical">

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <ImageView
            android:gravity="top"
            android:layout_gravity="top"
            android:id="@+id/iv"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:visibility="visible" />

        <LinearLayout
            android:id="@+id/llRightLeft"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center">

            <Button
                android:id="@+id/bLeft"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="LEFT" />

            <Button
                android:id="@+id/bRight"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="RIGHT" />
        </LinearLayout>


        <LinearLayout
            android:layout_gravity="center_horizontal"
            android:id="@+id/llCropOverlay"
            android:layout_width="match_parent"
            android:layout_height="70dp"
            android:background="@color/colorCropOverlay"
            android:orientation="vertical" />
    </FrameLayout>
</LinearLayout>

应调整最后一个LinearLayout(llCropOverlay)的大小。请注意,在使用按钮调整大小之前,我以编程方式将宽度更改为300,以便我可以测试按钮是否正常工作。

1 个答案:

答案 0 :(得分:1)

我找到了一个几乎完美的解决方案(有时一个像素有问题很烦人 - 任何建议都会受到赞赏)。

为此,我们需要设置一些变量。首先,必须找到并识别名为llCropOverlay的LinearLayout。 这是它的xml:

        <LinearLayout
            android:layout_gravity="center_horizontal"
            android:id="@+id/llCropOverlay"
            android:layout_width="200dp"
            android:layout_height="150dp"
            android:background="@color/colorCropOverlay"
            android:orientation="vertical" />

现在,在允许用户进行交互之前,我们需要找到llCropOverlay的原始位置。所以在OnCreate()中使用它:

llCropOverlay.post(new Runnable() {
            @Override
            public void run() {
                orgX = llCropOverlay.getX();
            }
        });

现在设置所有按钮并在这些按钮上设置setOnTouchListener()。然后,当调用侦听器时,按以下方法传递触摸的按钮。使用Handler和postDelayed()继续调用此方法,直到按下按钮。或者调用一次以按一个像素行/列调整大小。

void handleTouchOrClick(View view) {
    ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) 
               llCropOverlay.getLayoutParams();

    switch (view.getId()) {
        case R.id.bUp:
            params.height = params.height - 1;
            break;
        case R.id.bDown:
            params.height = params.height + 1;
            break;
        case R.id.bRight:
            params.width = params.width + 1;
            llCropOverlay.post(new Runnable() {
                @Override
                public void run() {
                    llCropOverlay.setX(orgX);
                }
            });
            break;
        case R.id.bRightContract:
            params.width = params.width - 1;
            llCropOverlay.post(new Runnable() {
                @Override
                public void run() {
                    llCropOverlay.setX(orgX);
                }
            });
            break;
        case R.id.bLeft:
            params.width = params.width + 1;
            orgX--;
            llCropOverlay.post(new Runnable() {
                @Override
                public void run() {
                    llCropOverlay.setX(orgX);
                }
            });
            break;
        case R.id.bLeftContract:
            params.width = params.width - 1;
            orgX++;
            llCropOverlay.post(new Runnable() {
                @Override
                public void run() {
                    llCropOverlay.setX(orgX);
                }
            });
            break;
    }
    llCropOverlay.setLayoutParams(params);
}

现在我们实际调整图片的大小如下: 为了方便用户,我分两步进行裁剪。

从侧面裁剪:

            ViewGroup.MarginLayoutParams params =
     (ViewGroup.MarginLayoutParams) llCropOverlay.getLayoutParams();

                    float eventX = params.width;
                    float eventY = 0;
                    float[] eventXY = new float[]{eventX, eventY};

                    Matrix invertMatrix = new Matrix();
                    imageView.getImageMatrix().invert(invertMatrix);

                    invertMatrix.mapPoints(eventXY);
                    int x = Integer.valueOf((int) eventXY[0]);
                    int y = Integer.valueOf((int) eventXY[1]);

                    int height = params.height;
                    while (height * 3 > originalBitmap.getHeight()) {
                        height = height - 10;
                    }
                    croppedBitmapByWidth = Bitmap.createBitmap(originalBitmap, (int) orgX, 0,
                            x, height);
                    imageView.setImageBitmap(croppedBitmapByWidth);    

从底部裁剪:

                    float eventX2 = 0;
                    float eventY2 = params.height;
                    float[] eventXY2 = new float[]{eventX2, eventY2};

                    Matrix invertMatrix2 = new Matrix();
                    imageView.getImageMatrix().invert(invertMatrix2);

                    invertMatrix2.mapPoints(eventXY2);
                    int x2 = Integer.valueOf((int) eventXY2[0]);
                    int y2 = Integer.valueOf((int) eventXY2[1]);

                    croppedBitmapByHeight = Bitmap.createBitmap(croppedBitmapByWidth, 0, 0, 
                                 croppedBitmapByWidth.getWidth(), y2);
                    imageView.setImageBitmap(croppedBitmapByHeight);
相关问题