Android - 只有一个角是圆角的 ImageView
Android - ImageView with rounded only one corner
我想像这样创建 ImageView(图像的右侧):
我在 CardView 布局中有它,所以我有圆角的卡片,但我需要单独创建图像的左下角(或右上角)。
我尝试了几个选项,但没有一个能正常工作。
我该怎么做?你有什么建议吗?
这很简单,只需制作可绘制资源文件即可text_logo_fix.xml
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#fff"/>
<corners android:bottomLeftRadius="30dp" android:topRightRadius="30dp"/>
</shape>
并在 ImageView 中设置此可绘制文件 属性 android:background
<ImageView
android:id="@+id/imageView"
android:layout_width="100dp"
android:layout_height="100dp"
android:background="@drawable/herenamedrawableresourcefile"
android:layout_gravity="center_horizontal"
android:src="@drawable/text_logo_fix" />
或者你可以这样看
<LinearLayout
android:padding="10dp"
android:layout_marginTop="20dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/herenamedrawableresourcefile">
<ImageView
android:id="@+id/imageView"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_gravity="center_horizontal"
android:src="@drawable/text_logo_fix" />
</LinearLayout>
试试这个:
<androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="16dp"
app:cardCornerRadius="20dp">
<ImageView
android:id="@+id/image_view"
android:layout_width="150dp"
android:layout_height="150dp"
android:layout_gravity="top|right"
android:scaleType="fitXY"
android:src="@drawable/person" />
</androidx.cardview.widget.CardView>
在你的 activity 中:
ImageView image = findViewById(R.id.image_view);
Bitmap bitImg = BitmapFactory.decodeResource(getResources(),
R.drawable.person);
image.setImageBitmap(createRoundedRectBitmap(bitImg, 0, 20, 0, 20));
}
private static Bitmap createRoundedRectBitmap(@NonNull Bitmap bitmap, float topLeftCorner, float topRightCorner, float bottomRightCorner,
float bottomLeftCorner) {
Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(output);
final int color = Color.WHITE;
final Paint paint = new Paint();
final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
final RectF rectF = new RectF(rect);
Path path = new Path();
float[] radii = new float[]{
topLeftCorner, bottomLeftCorner,
topRightCorner, topRightCorner,
bottomRightCorner, bottomRightCorner,
bottomLeftCorner, bottomLeftCorner
};
paint.setAntiAlias(true);
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(color);
path.addRoundRect(rectF, radii, Path.Direction.CW);
canvas.drawPath(path, paint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(bitmap, rect, rect, paint);
return output;
}
您可以使用这个库并将您的 ImageView 放在 Layout 中
https://github.com/JcMinarro/RoundKornerLayouts
并且可以像这样设置特定角的半径
containerLayout.setCornerRadius(2f, CornerType.ALL);
containerLayout.setCornerRadius(2f, CornerType.BOTTOM_LEFT);
其他选择
public final enum class CornerType private constructor() : kotlin.Enum<com.jcminarro.roundkornerlayout.CornerType> {
ALL,
TOP_LEFT,
TOP_RIGHT,
BOTTOM_RIGHT,
BOTTOM_LEFT;
}
您可以使用 Material Components Library.
对于版本 1.2.0-alpha03
有新的 ShapeableImageView
.
只需在您的布局中使用:
<com.google.android.material.imageview.ShapeableImageView
app:srcCompat="@drawable/..."
../>
并在您的代码中应用 ShapeAppearanceModel
和:
float radius = getResources().getDimension(R.dimen.default_corner_radius);
imageView.setShapeAppearanceModel(imageView.getShapeAppearanceModel()
.toBuilder()
.setTopRightCorner(CornerFamily.ROUNDED,radius)
.setBottomLeftCorner(CornerFamily.ROUNDED,radius)
.build());
我想像这样创建 ImageView(图像的右侧):
我在 CardView 布局中有它,所以我有圆角的卡片,但我需要单独创建图像的左下角(或右上角)。
我尝试了几个选项,但没有一个能正常工作。
我该怎么做?你有什么建议吗?
这很简单,只需制作可绘制资源文件即可text_logo_fix.xml
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#fff"/>
<corners android:bottomLeftRadius="30dp" android:topRightRadius="30dp"/>
</shape>
并在 ImageView 中设置此可绘制文件 属性 android:background
<ImageView
android:id="@+id/imageView"
android:layout_width="100dp"
android:layout_height="100dp"
android:background="@drawable/herenamedrawableresourcefile"
android:layout_gravity="center_horizontal"
android:src="@drawable/text_logo_fix" />
或者你可以这样看
<LinearLayout
android:padding="10dp"
android:layout_marginTop="20dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/herenamedrawableresourcefile">
<ImageView
android:id="@+id/imageView"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_gravity="center_horizontal"
android:src="@drawable/text_logo_fix" />
</LinearLayout>
试试这个:
<androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="16dp"
app:cardCornerRadius="20dp">
<ImageView
android:id="@+id/image_view"
android:layout_width="150dp"
android:layout_height="150dp"
android:layout_gravity="top|right"
android:scaleType="fitXY"
android:src="@drawable/person" />
</androidx.cardview.widget.CardView>
在你的 activity 中:
ImageView image = findViewById(R.id.image_view);
Bitmap bitImg = BitmapFactory.decodeResource(getResources(),
R.drawable.person);
image.setImageBitmap(createRoundedRectBitmap(bitImg, 0, 20, 0, 20));
}
private static Bitmap createRoundedRectBitmap(@NonNull Bitmap bitmap, float topLeftCorner, float topRightCorner, float bottomRightCorner,
float bottomLeftCorner) {
Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(output);
final int color = Color.WHITE;
final Paint paint = new Paint();
final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
final RectF rectF = new RectF(rect);
Path path = new Path();
float[] radii = new float[]{
topLeftCorner, bottomLeftCorner,
topRightCorner, topRightCorner,
bottomRightCorner, bottomRightCorner,
bottomLeftCorner, bottomLeftCorner
};
paint.setAntiAlias(true);
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(color);
path.addRoundRect(rectF, radii, Path.Direction.CW);
canvas.drawPath(path, paint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(bitmap, rect, rect, paint);
return output;
}
您可以使用这个库并将您的 ImageView 放在 Layout 中
https://github.com/JcMinarro/RoundKornerLayouts
并且可以像这样设置特定角的半径
containerLayout.setCornerRadius(2f, CornerType.ALL);
containerLayout.setCornerRadius(2f, CornerType.BOTTOM_LEFT);
其他选择
public final enum class CornerType private constructor() : kotlin.Enum<com.jcminarro.roundkornerlayout.CornerType> {
ALL,
TOP_LEFT,
TOP_RIGHT,
BOTTOM_RIGHT,
BOTTOM_LEFT;
}
您可以使用 Material Components Library.
对于版本 1.2.0-alpha03
有新的 ShapeableImageView
.
只需在您的布局中使用:
<com.google.android.material.imageview.ShapeableImageView
app:srcCompat="@drawable/..."
../>
并在您的代码中应用 ShapeAppearanceModel
和:
float radius = getResources().getDimension(R.dimen.default_corner_radius);
imageView.setShapeAppearanceModel(imageView.getShapeAppearanceModel()
.toBuilder()
.setTopRightCorner(CornerFamily.ROUNDED,radius)
.setBottomLeftCorner(CornerFamily.ROUNDED,radius)
.build());