如何在Android中的可绘制中创建相机框架

时间:2019-01-02 13:24:15

标签: android-layout android-drawable

根据我的要求,我必须在camera view上显示一个框,以使脸部与用户对齐,如下图所示:

enter image description here

我能够创建一个drawablexml,但是无法实现内圈的透明性,因此可以清晰地看到相机。我可以在drawable下创建:

enter image description here

使用以下简单xml:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape xmlns:android="http://schemas.android.com/apk/res/android"
            android:shape="rectangle">
            <solid android:color="#44000000" />
            <padding
                android:bottom="50dp"
                android:left="20dp"
                android:right="20dp"
                android:top="50dp" />
        </shape>
    </item>

    <item>
        <shape xmlns:android="http://schemas.android.com/apk/res/android"
            android:shape="oval">
            <solid android:color="#ffffff" />
        </shape>
    </item>
</layer-list>

是否可以在可绘制对象中创建这种类型的框架或图层?

2 个答案:

答案 0 :(得分:1)

使用这种方法可使中心区域透明,但不能使其变为椭圆形。这可能会对您有所帮助。

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape xmlns:android="http://schemas.android.com/apk/res/android"
            android:shape="rectangle">
            <solid android:color="#00000000" />
            <stroke android:width="100dp"
                android:color="#e6e6e6"></stroke>
            <padding
                android:bottom="50dp"
                android:left="20dp"
                android:right="20dp"
                android:top="50dp" />
        </shape>
    </item>

</layer-list>

答案 1 :(得分:0)

我有一个解决方案,但是不是通过xml 可绘制的。我们可以通过扩展CustomView类来创建View,该类可以按要求执行相同的操作:

public class RadiusOverlayView extends View {

    Bitmap bm;
    Canvas cv;
    Paint eraser;

    public RadiusOverlayView(Context context) {
        super(context);
        Init();
    }

    public RadiusOverlayView(Context context, AttributeSet attrs) {
        super(context, attrs);
        Init();
    }

    public RadiusOverlayView(Context context, AttributeSet attrs,
                             int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        Init();
    }

    private void Init() {

        eraser = new Paint();
        eraser.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
        eraser.setAntiAlias(true);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {

        if (w != oldw || h != oldh) {
            bm = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
            cv = new Canvas(bm);
        }
        super.onSizeChanged(w, h, oldw, oldh);
    }

    @Override
    protected void onDraw(Canvas canvas) {

        int w = getWidth();
        int h = getHeight();
        int radius = w > h ? h / 2 : w / 2;

        bm.eraseColor(Color.TRANSPARENT);
        cv.drawColor(getResources().getColor(R.color.colorPrimary));
        cv.drawCircle(w / 2, h / 2, radius, eraser);
        canvas.drawBitmap(bm, 0, 0, null);
        super.onDraw(canvas);
    }
}

将此视图作为图层添加到camera view上。

谢谢