2017-10-11 5 views
0

Je suis en train de développer un BarcodeReader en utilisant Google play services, et je voudrais obtenir un fond de surface de la caméra comme l'échantillon Zxing. En fait, je vois avec un fond transparent noir et un rectangle de toile blanc, et je voudrais que ce rectangle soit transparent, donc ma question est si je peux changer l'arrière-plan de la vue sans cette limite Rect.Changer la couleur d'arrière-plan à une zone limitée d'une vue - Android

enter image description here

Ceci est mon affichage personnalisé où je dessine des lignes

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; 
} 

}

Ceci est mon xml où le CameraSourePreview et MyView (vue personnalisée juste pour peindre des lignes d'écran) sont :

<?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>                

Une aide? Merci.

+0

Vous devez implémenter ces bibliothèques avec le soutien de cette feature.Try ce https://github.com/zxing/zxing –

+0

Le point est que je ne veux pas utiliser Zxyng, j'utilise Google play-services-vision: 11.4.0, mais merci –

+0

Veuillez consulter https://github.com/googlesamples/android-vision/tree/master/visionSamples/barcode -reader/app/src/main –

Répondre

0

Je l'ai résolu avec le chemin de remplissage inverse

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)); 

} 

enter image description here