Skip to content Skip to sidebar Skip to footer

Increase Linearlayout Width From Either Right Or Left

I have a LinearLayout which is centered on the screen. It has a width less than the screen width. There are two buttons: Right-Arrow and Left-Arrow. When the user presses the relev

Solution 1:

I have found an almost perfect solution (there is sometimes a problem with one pixel which is annoying - any suggestions will be appreciated).

For this, we need some variables set up. Firstly, the LinearLayout called llCropOverlay must be found and identified. Here is its 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" />

Now before allowing user to interact we need to find the original position of the llCropOverlay. So use this in OnCreate():

llCropOverlay.post(newRunnable() {
            @Overridepublicvoidrun() {
                orgX = llCropOverlay.getX();
            }
        });

Now set up all the buttons and set a setOnTouchListener() on these buttons. Then when the listener is called, pass the touched button in the following method. Use a Handler and postDelayed() to keep calling this method till the button is pressed. Or call it once to resize by one pixel row/column.

voidhandleTouchOrClick(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
                publicvoidrun() {
                    llCropOverlay.setX(orgX);
                }
            });
            break;
        case R.id.bRightContract:
            params.width = params.width - 1;
            llCropOverlay.post(new Runnable() {
                @Override
                publicvoidrun() {
                    llCropOverlay.setX(orgX);
                }
            });
            break;
        case R.id.bLeft:
            params.width = params.width + 1;
            orgX--;
            llCropOverlay.post(new Runnable() {
                @Override
                publicvoidrun() {
                    llCropOverlay.setX(orgX);
                }
            });
            break;
        case R.id.bLeftContract:
            params.width = params.width - 1;
            orgX++;
            llCropOverlay.post(new Runnable() {
                @Override
                publicvoidrun() {
                    llCropOverlay.setX(orgX);
                }
            });
            break;
    }
    llCropOverlay.setLayoutParams(params);
}

Now here's how we actually resize the image: For ease of users I am cropping it in two steps.

Crop from sides:

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

                    float eventX = params.width;
                    float eventY = 0;
                    float[] eventXY = newfloat[]{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);    

crop from bottom:

float eventX2 = 0;
                    float eventY2 = params.height;
                    float[] eventXY2 = newfloat[]{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);

Post a Comment for "Increase Linearlayout Width From Either Right Or Left"