我有一个以屏幕为中心的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,以便我可以测试按钮是否正常工作。
答案 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);