簡體   English   中英

將背景顏色更改為視圖的有限區域-Android

[英]Change background color to a limited area of a view - Android

我正在嘗試使用Google Play服務開發BarcodeReader,並且我想獲得像Zxing示例這樣的相機表面背景。 zxing示例圖像

實際上,我使用黑色透明背景和白色Rect畫布查看,並且我希望此Rect是透明的,所以我的問題是是否可以在沒有此Rect邊界的情況下更改視圖背景。

在此處輸入圖片說明

這是我的自定義視圖,我在其中畫了一些線

public class MyView extends View {

private Paint paint;
private Path path;
private int width, height;
Canvas canvas;
private Rect rectangle;


public MyView(Context context) {
    super(context);
    init();
}

public MyView(Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);
    init();
}

public MyView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    init();
}

private void init() {
    paint = new Paint();
    paint.setColor(Color.RED);
    paint.setStrokeWidth(10);
    paint.setStyle(Paint.Style.STROKE);
    this.setBackgroundColor(getResources().getColor(R.color.black60));

}


@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    this.canvas = canvas;
    drawMiddleLine();
    drawLeftUpCorner();
    drawLeftDownCorner();
    drawRightUpCorner();
    drawRightDownCorner();
    drawRectSample();
}

private void drawRectSample() {
    int x = width / 6;
    int y = height / 4;
    int widthLength = x*5;
    int heightLenght = y* 3;
    Paint paint = new Paint();
    // create a rectangle that we'll draw later
    rectangle = new Rect(x, y, widthLength, heightLenght);
    paint.setStyle(Paint.Style.FILL);
    paint.setColor(getResources().getColor(R.color.white50));
    canvas.drawRect(rectangle, paint);


}

private void drawLeftUpCorner() {
    if (width != 0 && height != 0) {
        int startX = width / 6;
        int startY = height / 4;
        int endX = startX * 2;
        int endY = startY;
        canvas.drawLine(startX, startY, endX, endY, paint);
        endX = startX;
        endY += startX;
        canvas.drawLine(startX, startY, endX, endY, paint);
    }
}

private void drawLeftDownCorner() {
    if (width != 0 && height != 0) {
        int startX = width / 6;
        int startY = height / 4 * 3;
        int endX = startX * 2;
        int endY = startY;
        canvas.drawLine(startX, startY, endX, endY, paint);
        endX = startX;
        endY -= startX;
        canvas.drawLine(startX, startY, endX, endY, paint);

    }
}

private void drawRightUpCorner() {
    if (width != 0 && height != 0) {
        int startX = (width / 6) * 4;
        int startY = height / 4;
        int endX = startX + (width / 6);
        int endY = startY;
        canvas.drawLine(startX, startY, endX, endY, paint);
        startX = endX;
        endY = startY + (width / 6);
        canvas.drawLine(startX, startY, endX, endY, paint);
    }
}

private void drawRightDownCorner() {
    if (width != 0 && height != 0) {
        int startX = (width / 6) * 4;
        int startY = (height / 4) * 3;
        int endX = startX + (width/ 6);
        int endY = startY;
        canvas.drawLine(startX, startY, endX, endY, paint);
        startX = endX;
        endY -= width / 6;
        canvas.drawLine(startX, startY, endX, endY, paint);

    }
}


private void drawMiddleLine() {
    if (width != 0 && height != 0) {
        int startX = width / 3;
        int startY = height / 2;
        int endX = startX * 2;
        int endY = startY;
        canvas.drawLine(startX, startY, endX, endY, paint);
        paint.setColor(Color.GREEN);
    }
}

public void setBounds(int width, int height) {
    this.width = width;
    this.height = height;
}

}

這是我的xml,其中CameraSourePreview和MyView(僅用於繪制屏幕線的自定義視圖)為:

<?xml version="1.0" encoding="utf-8"?>                                        
<RelativeLayout                                                               
xmlns:android="http://schemas.android.com/apk/res/android"                
android:id="@+id/topLayout"                                               
android:orientation="vertical"                                            
android:layout_width="match_parent"                                       
android:layout_height="match_parent"                                      
android:keepScreenOn="true"                                               
>                                                                         

<t_systems.qrlabs.camera.CameraSourcePreview                              
    android:id="@+id/preview"                                             
    android:layout_width="match_parent"                                   
    android:layout_height="match_parent">                                 

</t_systems.qrlabs.camera.CameraSourcePreview>                            


<t_systems.qrlabs.barcode.MyView                                          
    android:layout_width="match_parent"                                   
    android:id="@+id/myView"                     
    android:layout_centerInParent="true"                                  
    android:layout_height="match_parent" />                               
</RelativeLayout>                                                             

有什么幫助嗎? 謝謝。

我用逆填充路徑解決了

private void drawBlackBackgorund() {
    int x = width / 6;
    int y = height / 4;
    int widthLength = x*5;
    int heightLenght = y* 3;

    RectF rect = new RectF(x,y,widthLength,heightLenght);

    path.addRect(rect,Path.Direction.CW);
    path.setFillType(Path.FillType.INVERSE_EVEN_ODD);
    canvas.clipPath(path);
    canvas.drawColor(getResources().getColor(R.color.black60));

}

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM