2015-09-14 13 views
5

Để có cái nhìn tùy chỉnh sau: Nếu chiều rộng đột quỵ là 0.01 sau đó trong Android M và và pre-M thiết bị (ví dụ: kẹo)Android M: Canvas strokeWidth và vấn đề strokeStyle khi vẽ vòng cung

enter image description here

Tuy nhiên Nếu chiều rộng đột quỵ là 0.0f sau đó trong Android M và và các thiết bị pre-M (ví dụ: kẹo)

enter image description here

có thay đổi trong chiều rộng đột quỵ trong Android M mà cần được xem xét? Có một sự phụ thuộc giữa phong cách Stroke và chiều rộng đột quỵ không?

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

Mã mà thực hiện speedometer.java được hiển thị dưới đây:

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; 

    } 


} 

Từ mã TestView.java, centerOuterPaint.setStrokeWidth (strokeWidth) dường như gây ra vấn đề.

Đây là một phần của mô-đun ứng dụng của tôi và không hoạt động trên Android M. Thử nghiệm trên Nexus 5 chạy Android 6.0.

mã nguồn tại https://github.com/vyshas/SpeedometerTest

+0

để bạn đã gỡ lỗi mã của mình? – pskink

+0

@pskink yes Tôi đã làm ... –

+0

và bạn có nhận thấy điều gì sẽ xảy ra nếu bạn sử dụng tỷ lệ nhỏ hơn trong 'onDraw'? 100 chẳng hạn? – pskink

Trả lời

1

Bạn có một vài vấn đề ở đây:

  1. bao giờ sử dụng canvas.save(Canvas.MATRIX_SAVE_FLAG); Thay vào đó chỉ cần sử dụng canvas.save().

Lưu ý: nếu có thể, hãy sử dụng thông số tiết kiệm ít hơn(). Nó đơn giản hơn và nhanh hơn so với cá nhân vô hiệu hoá việc lưu ma trận hoặc clip với phương pháp này.

  1. Bạn đang vẽ tất cả mọi thứ ở cấp vi trong khoảng (0 ... 1). Và sau đó bạn đang mở rộng nó lên gần một trăm lần. Thật tệ. canvas.scale() không nên được sử dụng theo cách này. Thay vào đó, hãy thử vẽ các phần tử của bạn ở quy mô bình thường.

    Bạn có thể sử dụng canvas.getHeight()canvas.getWidth() để nhận được heightwidth của chế độ xem bạn có. Dựa trên chi tiết này, hãy vẽ arcline.

+0

Tôi sẽ cố gắng thực hiện những thay đổi mà bạn đã đề cập nhưng Tôi vẫn không hiểu tại sao nó chỉ xảy ra cho các thiết bị Android m? –

Các vấn đề liên quan