android - 从右侧或左侧增加 LinearLayout 宽度

标签 android width android-linearlayout

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

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

我正在使用 following 来增加宽度,但它具有上述行为。

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,因此我可以测试按钮是否正常工作。

最佳答案

我找到了一个近乎完美的解决方案(有时一个像素会出现问题,这很烦人 - 任何建议都将不胜感激)。

为此,我们需要设置一些变量。首先,必须找到并识别名为 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);

关于android - 从右侧或左侧增加 LinearLayout 宽度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45257162/

相关文章:

java - Flutter Java android从/app_flutter文件夹中的文件获取数据

java - 执行返回第一项后无限滚动

android - 基于android中的大文本布局变化

java - 如何在 Android 中将 TextView 添加到 LinearLayout

启动 FFmpegFrameGrabber 中的 java.lang.UnsatisfiedLinkError : org. bytedeco.javacpp.avutil

android - "Too many open files"- 无法删除目录

html - 移动网站视口(viewport)精确宽度问题

javascript - 在用户上传 reactjs 时获取 mp4 的尺寸

css - 如何减少 100% 宽度 div 中两个元素之间的间隙?

android - 以编程方式创建 LinearLayout 后居中元素