自定义图像视图切割左右边缘半圆
Custom Image View Cut Left and Right Edges Semi Circle
在开发自定义视图方面需要帮助。这是我需要发展的那种观点:
试过一种方法,但它不像卡片,背景中可以看到它的曲线和卡片。切割的左右边缘需要一些透明的东西。
参考过https://github.com/mreram/TicketView,但这并没有像卡片一样的效果,需要一个中间有左右切边的视图,看起来像卡片。关于将图像视图自定义为如下所示有什么想法吗?
我希望这会对你有所帮助,我确实在很久之前创建了一个 class 扩展 FrameLayout 可以为你完成工作。
输出结果如下
我通过以下代码实现了这一点。
MyRoundCornerFrame.java
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Path;
import android.graphics.RectF;
import android.graphics.Region;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.view.View;
import android.widget.FrameLayout;
public class MyRoundCornerFrame extends FrameLayout {
private final static float CORNER_RADIUS = 30.0f; //card radius chnage accordingly
private float cornerRadius;
public MyRoundCornerFrame(Context context) {
super(context);
init(context, null, 0);
}
public MyRoundCornerFrame(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs, 0);
}
public MyRoundCornerFrame(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context, attrs, defStyle);
}
private void init(Context context, AttributeSet attrs, int defStyle) {
DisplayMetrics metrics = context.getResources().getDisplayMetrics();
cornerRadius = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, CORNER_RADIUS, metrics);
setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}
@Override
protected void dispatchDraw(Canvas canvas) {
int count = canvas.save();
final Path path = new Path();
path.addRoundRect(new RectF(0, 0, canvas.getWidth(), canvas.getHeight()), cornerRadius, cornerRadius, Path.Direction.CW);
canvas.clipPath(path, Region.Op.INTERSECT);
canvas.clipPath(path);
super.dispatchDraw(canvas);
canvas.restoreToCount(count);
}
}
我的 XML 文件如下所示
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white"
android:paddingTop="30dp">
<your.package.name.MyRoundCornerFrame
android:id="@+id/card_view"
android:layout_width="match_parent"
android:layout_height="200dp"
android:layout_margin="20dp">
<ImageView
android:layout_width="match_parent"
android:layout_height="200dp"
android:background="@drawable/food"
android:padding="20dp" />
</your.package.name.MyRoundCornerFrame>
<ImageView
android:layout_width="match_parent"
android:layout_height="200dp"
android:layout_marginTop="20dp"
android:layout_marginBottom="20dp"
android:background="@drawable/ticket_view"
android:padding="10dp"
tools:ignore="ContentDescription" />
</FrameLayout>
为了在中心显示半圆,我创建了一个名为 ticket_view.xml 的 XML 图层列表,如下所示
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<corners android:radius="5dp" />
</shape>
</item>
<item
android:width="50dp"
android:height="50dp"
android:gravity="start|center">
<shape android:shape="oval">
<solid android:color="@android:color/white" />
</shape>
</item>
<item
android:width="50dp"
android:height="50dp"
android:gravity="end|center">
<shape android:shape="oval">
<solid android:color="@android:color/white" />
</shape>
</item>
</layer-list>
这样做的一个优点是您不需要任何库来创建它。
我希望这能以某种方式帮助你,编码愉快
在开发自定义视图方面需要帮助。这是我需要发展的那种观点:
试过一种方法,但它不像卡片,背景中可以看到它的曲线和卡片。切割的左右边缘需要一些透明的东西。
参考过https://github.com/mreram/TicketView,但这并没有像卡片一样的效果,需要一个中间有左右切边的视图,看起来像卡片。关于将图像视图自定义为如下所示有什么想法吗?
我希望这会对你有所帮助,我确实在很久之前创建了一个 class 扩展 FrameLayout 可以为你完成工作。
输出结果如下
我通过以下代码实现了这一点。
MyRoundCornerFrame.java
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Path;
import android.graphics.RectF;
import android.graphics.Region;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.view.View;
import android.widget.FrameLayout;
public class MyRoundCornerFrame extends FrameLayout {
private final static float CORNER_RADIUS = 30.0f; //card radius chnage accordingly
private float cornerRadius;
public MyRoundCornerFrame(Context context) {
super(context);
init(context, null, 0);
}
public MyRoundCornerFrame(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs, 0);
}
public MyRoundCornerFrame(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context, attrs, defStyle);
}
private void init(Context context, AttributeSet attrs, int defStyle) {
DisplayMetrics metrics = context.getResources().getDisplayMetrics();
cornerRadius = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, CORNER_RADIUS, metrics);
setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}
@Override
protected void dispatchDraw(Canvas canvas) {
int count = canvas.save();
final Path path = new Path();
path.addRoundRect(new RectF(0, 0, canvas.getWidth(), canvas.getHeight()), cornerRadius, cornerRadius, Path.Direction.CW);
canvas.clipPath(path, Region.Op.INTERSECT);
canvas.clipPath(path);
super.dispatchDraw(canvas);
canvas.restoreToCount(count);
}
}
我的 XML 文件如下所示
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white"
android:paddingTop="30dp">
<your.package.name.MyRoundCornerFrame
android:id="@+id/card_view"
android:layout_width="match_parent"
android:layout_height="200dp"
android:layout_margin="20dp">
<ImageView
android:layout_width="match_parent"
android:layout_height="200dp"
android:background="@drawable/food"
android:padding="20dp" />
</your.package.name.MyRoundCornerFrame>
<ImageView
android:layout_width="match_parent"
android:layout_height="200dp"
android:layout_marginTop="20dp"
android:layout_marginBottom="20dp"
android:background="@drawable/ticket_view"
android:padding="10dp"
tools:ignore="ContentDescription" />
</FrameLayout>
为了在中心显示半圆,我创建了一个名为 ticket_view.xml 的 XML 图层列表,如下所示
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<corners android:radius="5dp" />
</shape>
</item>
<item
android:width="50dp"
android:height="50dp"
android:gravity="start|center">
<shape android:shape="oval">
<solid android:color="@android:color/white" />
</shape>
</item>
<item
android:width="50dp"
android:height="50dp"
android:gravity="end|center">
<shape android:shape="oval">
<solid android:color="@android:color/white" />
</shape>
</item>
</layer-list>
这样做的一个优点是您不需要任何库来创建它。
我希望这能以某种方式帮助你,编码愉快