我有一个位于屏幕中央的 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/