2015-09-14 9 views
5

Na poniższym widoku niestandardowego: Jeśli szerokość skok wynosi 0,01, a następnie w Android M i i pre-M Urządzenia (ex: lizak)Android M: Płótno strokeWidth i strokeStyle problem podczas łuki rysunek

enter image description here

Jeżeli jednak szerokość udar jest 0.0f następnie w M i Android i urządzeń pre-M (ex: lizak)

enter image description here

Czy istnieją zmiany w szerokości skoku w Android M, które powinny być brane pod uwagę? Czy istnieje zależność między stylem obrysu a szerokością obrysu?

plik XML układ:

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

Kod, który implementuje speedometer.java przedstawiono poniżej:

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; 

    } 


} 

z kodu TestView.java, centerOuterPaint.setStrokeWidth (strokeWidth) wydaje się przyczyną problemu.

To jest część mojego modułu aplikacji i nie działa na Androidzie M. Testowane na Nexusie 5 z systemem Android 6.0.

kod źródłowy w https://github.com/vyshas/SpeedometerTest

+0

więc już zdebugowałeś swój kod? – pskink

+0

@pskink yes Zrobiłem .... –

+0

i czy zauważyłeś, co się dzieje, jeśli używasz mniejszej skali w 'onDraw'? 100 na przykład? – pskink

Odpowiedz

1

Masz kilka problemów tutaj:

  1. Nigdy nie używaj canvas.save(Canvas.MATRIX_SAVE_FLAG); Zamiast po prostu użyć canvas.save().

Uwaga: jeśli to możliwe, użyj funkcji zapisu bez zmian(). Jest to prostsze i szybsze niż indywidualne wyłączanie zapisywania matrycy lub klipu przy użyciu tej metody.

  1. możliwość rysowania wszystkiego na poziomie mikroskopowym w przedziale (0 ... 1). A potem przeskalujesz go prawie sto razy. To jest złe. canvas.scale() nie należy używać w ten sposób. Zamiast tego spróbuj rysować swoje elementy w normalnej skali.

    Możesz użyć canvas.getHeight() i canvas.getWidth(), aby uzyskać height i width z widoku, który posiadasz. Na podstawie tego szczegółu narysuj arc i line.

+0

Spróbuję zrobić zmiany, o których wspomniałem, ale Nadal nie rozumiem, dlaczego tak się dzieje tylko dla urządzeń z Androidem? –

Powiązane problemy