Android M: Canvas strokeWidth y strokeStyle problema al dibujar arcos

Para la siguiente vista personalizada: Si el ancho de trazo es 0,01, en los dispositivos Android M y Pre-M (por ejemplo: lollipop)

Introduzca aquí la descripción de la imagen

Sin embargo, si el ancho de trazo es 0.0f, en los dispositivos Android M y Pre-M (por ejemplo, Lollipop)

Introduzca aquí la descripción de la imagen

¿Hay cambios en el ancho de golpe en Android M que se deben considerar? ¿Hay un dependecy entre el estilo del movimiento y la anchura del movimiento?

Archivo de diseño 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" 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> 

El código que implementa speedometer.java se muestra a continuación:

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

Desde el código TestView.java , centerOuterPaint.setStrokeWidth (strokeWidth) parece causar el problema.

Esto es parte de mi módulo de aplicación y no funciona en Android M. Probado en Nexus 5 con Android 6.0.

Código fuente en https://github.com/vyshas/SpeedometerTest

Usted tiene un par de problemas aquí:

  1. Nunca utilice canvas.save(Canvas.MATRIX_SAVE_FLAG); En su lugar simplemente use canvas.save() .

Nota: si es posible, utilice el parámetro sin guardar (). Es más sencillo y más rápido que deshabilitar individualmente el ahorro de matriz o clip con este método.

  1. Estás dibujando todo a nivel microscópico en el rango de (0 … 1). Y entonces usted está escalando hasta casi cien veces. Esto es malo. canvas.scale() no debe usarse de esta manera. En su lugar trate de dibujar sus elementos a la escala normal en sí.

    Puede utilizar canvas.getHeight() y canvas.getWidth() para obtener la height y el width de la vista que tiene. Basándose en este detalle, dibuje el arc y la line .

  • Cómo cambiar el color de los iconos de notificación de la barra de estado / tinte en android (melcocha y más de 23+)?
  • Error de permiso de almacenamiento en Marshmallow
  • El permiso de manifiesto no funciona en Android 6
  • Cambio de comportamiento de SimpleDateFormat en Android Marshmallow
  • ¿Está disponible para establecer checkSelfPermission en SDK mínimo <23?
  • No se puede obtener el permiso de WRITE_SETTINGS
  • Cómo obtener la ruta SD_Card en android6.0 mediante programación
  • Error en la versión 6.0 de Android 6.0: EACCES (Permiso denegado)
  • ListFiles () devuelve null en el emulador de Android 6.0
  • Android 6 Marshmallow: las solicitudes de algunos permisos específicos se deniegan al instante sin mostrar ningún ui
  • ¿Cómo cambiamos MTP más fácilmente en un dispositivo Debug-Enabled Android 6.0?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.