2016-06-18 7 views
3

Я пытаюсь сделать деятельность, которая должна показывать квадратную площадь как сфокусированную. Пока я это сделал.Как уменьшить область вокруг вида в андроиде?

enter image description here

Теперь то, что я хочу, чтобы затемнить область за пределами площади. Использование framelayout уменьшает весь вид. Я только хочу тускнуть область за пределами площади.

+0

Вы можете иметь цвет фона быть полупрозрачным черным, чтобы сделать тень. Возможно, разместите весь свой макет xml, чтобы было ясно, куда его поместить. @pryankvex –

ответ

3

Вы можете нарисовать черный полупрозрачны прямоугольник, а затем нарисовать внутренний прямоугольник с paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT));

Как я ничего не знаю о макете, я даю полный пример с CustomOverlay класса:

my_activity. XML

<RelativeLayout 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:orientation="vertical"> 

    <fragment 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:id="@+id/map" 
     android:name="com.google.android.gms.maps.SupportMapFragment" /> 

    <mypackage.CustomOverlay 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_centerInParent="true" /> 

</RelativeLayout> 

(я использую карту в качестве базовой точки зрения вместо камеры)

CustomOverlay.java

public class CustomOverlay extends LinearLayout { 
    private Bitmap windowFrame; 

    public CustomOverlay(Context context) { 
     super(context); 
    } 

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

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

    @TargetApi(Build.VERSION_CODES.LOLLIPOP) 
    public CustomOverlay(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 
     super(context, attrs, defStyleAttr, defStyleRes); 
    } 

    @Override 
    protected void dispatchDraw(Canvas canvas) { 
     super.dispatchDraw(canvas); 

     if (windowFrame == null) { 
      createWindowFrame(); 
     } 
     canvas.drawBitmap(windowFrame, 0, 0, null); 
    } 

    @Override 
    public boolean isEnabled() { 
     return false; 
    } 

    @Override 
    public boolean isClickable() { 
     return false; 
    } 

    protected void createWindowFrame() { 
     windowFrame = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888); 
     Canvas osCanvas = new Canvas(windowFrame); 

     RectF outerRectangle = new RectF(0, 0, getWidth(), getHeight()); 

     Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); 
     paint.setColor(Color.argb(150, 0, 0, 0)); 
     osCanvas.drawRect(outerRectangle, paint); 

     paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT)); 
     RectF innerRectangle = new RectF(100, 200, getWidth() - 100, getHeight() - 200); 
     osCanvas.drawRect(innerRectangle, paint); 

     paint = new Paint(Paint.ANTI_ALIAS_FLAG); 
     paint.setStrokeWidth(5); 
     paint.setColor(Color.WHITE); 
     paint.setStyle(Paint.Style.STROKE); 
     osCanvas.drawRect(innerRectangle, paint); 
    } 

    @Override 
    public boolean isInEditMode() { 
     return true; 
    } 

    @Override 
    protected void onLayout(boolean changed, int l, int t, int r, int b) { 
     super.onLayout(changed, l, t, r, b); 
     windowFrame = null; 
    } 
} 

Результат выглядит следующим образом:

enter image description here

+0

Как бы вы это сделали, чтобы размер прямоугольника мог быть изменен, а тусклый вид будет достаточно близко, чтобы он был совершенно жидким? – galex

Смежные вопросы