2016-04-26 2 views
1

Picture linkAndroid Bar personnalisé: dessiner sur la barre d'état

Video link


Question:
Quand je utilisateur mon avis personnalisé dans le activity.and alors je change TranslationY de la coutume view.And Ensuite, la vue personnalisée dessine sur la barre d'état.


Lorsque je supprime le code, canvas.clipRect(0, 0, getWidth(), getHeight(), Region.Op.REPLACE); dans CustomView.java, il est sera ok.
Mais dans la situation réelle, j'ai besoin de la fonction clipRect pour limiter. Alors, comment puis-je calculer la gamme de clips.

Aidez-moi à résoudre le problème.

fichier Mise en page:

<RelativeLayout 
    android:id="@+id/action_bar" 
    android:layout_width="match_parent" 
    android:layout_height="40dp" 
    android:background="#00e0e0"> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerInParent="true" 
     android:text="Test Title" /> 

    <TextView 
     android:id="@+id/text" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentRight="true" 
     android:layout_centerVertical="true" 
     android:text="up" 
     android:textSize="32dp" /> 

</RelativeLayout> 

<cn.bangnijiao.testunitdemo.CustomView 
    android:id="@+id/counterView" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_below="@id/action_bar" 
    android:layout_centerHorizontal="true" /> 

code:

public class YActivity extends Activity { 

TextView up; 
CustomView customView; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_y); 

    up = (TextView) findViewById(R.id.text); 
    customView = (CustomView) findViewById(R.id.counterView); 

    up.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      customView.setTranslationY(customView.getTranslationY() - 20); 
     } 
    }); 

    findViewById(R.id.action_bar).bringToFront(); 
} 

}

code CustomView:

public class CustomView extends View { 

private Paint mPaint; 
int size = 120; 

public CustomView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); 
} 

@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    drawSeparatorsAndBackground(canvas); 
} 

private void drawSeparatorsAndBackground(Canvas canvas) { 

    mPaint.setColor(Color.YELLOW); 
    canvas.drawRect(0, 0, getWidth(), getHeight(), mPaint); 

    canvas.clipRect(0, 0, getWidth(), getHeight(), Region.Op.REPLACE); 

    mPaint.setColor(Color.BLACK); 

    int verticalCount = (getWidth()/size); 
    float[] verticalLines = new float[verticalCount * 4]; 

    for (int i = 0; i < verticalCount; i++) { 
     verticalLines[i * 4 + 0] = i * size; 
     verticalLines[i * 4 + 1] = 0; 
     verticalLines[i * 4 + 2] = i * size; 
     verticalLines[i * 4 + 3] = getHeight(); 
    } 
    canvas.drawLines(verticalLines, mPaint); 

    int hourHorizontalCount = (getHeight()/size); 
    float[] hourHorizontalLines = new float[hourHorizontalCount * 4]; 

    for (int i = 0; i < hourHorizontalCount; i++) { 
     hourHorizontalLines[i * 4 + 0] = 0; 
     hourHorizontalLines[i * 4 + 1] = i * size; 
     hourHorizontalLines[i * 4 + 2] = getWidth(); 
     hourHorizontalLines[i * 4 + 3] = i * size; 
    } 
    canvas.drawLines(hourHorizontalLines, mPaint); 
} 

}

Répondre

0

essayer canvas.save() et canvas.restore()

@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    int saveCount = canvas.save(); 
    drawSeparatorsAndBackground(canvas); 
    canvas.restoreToCount(saveCount); 
} 
+0

Merci, mais aucun effet – Kevinsu917

+0

@ Kevinsu917 Je vous lance le code pas tirer sur la barre d'état, peut-être votre les styles ont true et ActionBar set fitSystemWindows = true? – AlphaBoom

+0

arriver juste sur un téléphone. Comme Samsung Galaxy S6-5.1.0-API 22. Vous pouvez essayer par le simulateur Genymotion. – Kevinsu917