2015-09-14 13 views
5

Per la seguente visualizzazione personalizzata: Se la larghezza del tratto è 0,01 poi in Android M e e pre-M dispositivi (es: lollipop)Android M: Tela strokeWidth ed emissione strokeStyle mentre disegnare archi

enter image description here

Tuttavia, se la larghezza del tratto è 0.0f poi in Android M e dispositivi e pre-M (es: lecca-lecca)

enter image description here

ci sono cambiamenti nella larghezza del tratto in Android M che dovrebbe essere considerato? Esiste una dipendenza tra lo stile tratto e la larghezza del tratto?

XML file di layout:

<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" 
    tools:context="${relativePackage}.${activityClass}" > 

    <com.example.testspeedtestgui.TestView 
        android:id="@+id/testView1" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent" 
        android:layout_alignParentStart="true" 
        android:layout_alignParentEnd="true" 
        android:layout_alignParentTop="true" 
        android:layout_centerHorizontal="true" 
        android:layout_marginLeft="10dp" 
        android:layout_marginRight="10dp" 
        /> 

</RelativeLayout> 

Il codice che implementa speedometer.java è la seguente:

package com.example.testspeedtestgui; 
import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.Path; 
import android.graphics.RectF; 
import android.os.Build; 
import android.util.AttributeSet; 
import android.view.View; 

public class TestView extends View { 

    private Paint outerLogoPaint; 
    private Paint centerOuterPaint; 
    private Path outerLogoEdge; 


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

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

    public TestView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     init(context); 
    } 
    private void init(Context context) { 
     if(Build.VERSION.SDK_INT >= 11){ 
      this.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 
     } 
     initDrawingTools(); 

    } 

    private void initDrawingTools() { 

     float strokeWidth=0.01f; 
     centerOuterPaint=new Paint(); 
     centerOuterPaint.setAntiAlias(true); 
     centerOuterPaint.setColor(Color.BLUE); 
     centerOuterPaint.setStrokeWidth(strokeWidth); 
     centerOuterPaint.setStrokeCap(Paint.Cap.ROUND); 
     centerOuterPaint.setStyle(Paint.Style.STROKE); 

     RectF rect = new RectF(); 
     float angle = getSemicircle(0.025f,0.5f,0.975f,0.5f,rect); 
     outerLogoEdge = new Path(); 
     outerLogoEdge.moveTo(0.025f, 0.495f); 
     outerLogoEdge.arcTo(rect, angle, 180); 
     outerLogoEdge.moveTo(0.025f, 0.495f); 
     outerLogoEdge.lineTo(0.2f, 0.495f); 
     //Edge surrounding the lower part of outer semi circle(Logo edge Init) Logo edge Init 
     angle = getSemicircle(0.20f,0.5f,0.80f,0.5f,rect); 
     outerLogoEdge.arcTo(rect, angle, 180); 
     outerLogoEdge.moveTo(0.975f, 0.495f); 
     outerLogoEdge.lineTo(0.8f, 0.495f); 

    } 


    @Override 
    protected void onDraw(Canvas canvas) { 
     float scale = getWidth(); 
     canvas.save(Canvas.MATRIX_SAVE_FLAG); 
     canvas.scale(scale, scale); 
     drawLogo(canvas); 
     canvas.restore(); 

    } 

    private void drawLogo(Canvas canvas) { 

     canvas.save(Canvas.MATRIX_SAVE_FLAG); 
     canvas.drawPath(outerLogoEdge, centerOuterPaint); 
     canvas.restore(); 
    } 


    public float getSemicircle(float xStart, float yStart, float xEnd, 
      float yEnd, RectF ovalRectOUT) { 

     float centerX = xStart + ((xEnd - xStart)/2); 
     float centerY = yStart + ((yEnd - yStart)/2); 

     double xLen = (xEnd - xStart); 
     double yLen = (yEnd - yStart); 
     float radius = (float) (Math.sqrt(xLen * xLen + yLen * yLen)/2); 

     RectF oval = new RectF(centerX - radius, 
       centerY - radius, centerX + radius, 
       centerY + radius); 

     ovalRectOUT.set(oval); 

     double radStartAngle = 0; 
     radStartAngle = Math.atan2(yStart - centerY, xStart - centerX); 
     float startAngle = (float) Math.toDegrees(radStartAngle); 

     return startAngle; 

    } 


} 

Dal codice TestView.java, centerOuterPaint.setStrokeWidth (strokeWidth) sembra causare il problema.

Questo è parte del mio modulo app e non funziona su Android M. Testato su Nexus 5 con Android 6.0.

codice sorgente a https://github.com/vyshas/SpeedometerTest

+0

quindi hai già eseguito il debug del codice? – pskink

+0

@pskink si l'ho fatto ... –

+0

e hai notato cosa succede se usi una scala più piccola in 'onDraw'? 100 per esempio? – pskink

risposta

1

Hai un paio di problemi qui:

  1. Non usare mai canvas.save(Canvas.MATRIX_SAVE_FLAG); Invece basta usare canvas.save().

Nota: se possibile, utilizzare il parametro save(). È più semplice e più veloce di disabilitare singolarmente il salvataggio della matrice o della clip con questo metodo, .

  1. si sta disegnando tutto a livello microscopico nel range di (0 ... 1). E poi lo riduci di quasi un centinaio di volte. Questo non va bene. canvas.scale() non deve essere utilizzato in questo modo. Prova invece a disegnare i tuoi elementi alla scala normale stessa.

    È possibile utilizzare canvas.getHeight() e canvas.getWidth() per ottenere il height e width della vista che si dispone. Sulla base di questo dettaglio, disegnare lo arc e lo line.

+0

proverò a fare i cambiamenti che hai menzionato ma Ancora non capisco perché sta succedendo solo per dispositivi Android m? –

Problemi correlati