Android自定义视图代码在Jelly Bean 4.2中停止正常工作

Android自定义视图代码在Jelly Bean 4.2中停止正常工作,android,android-custom-view,android-4.2-jelly-bean,Android,Android Custom View,Android 4.2 Jelly Bean,下面的代码是一个自定义视图-它绘制一个圆,根据比例添加槽口,并添加比例文本。这源于Mind机器人关于制作老式温度计的优秀教程 此代码在运行到Jelly Bean 4.1.2的设备上运行良好,但在4.2上中断。在4.2版本中,数字不再围绕圆圈绘制,而是分散在整个屏幕上。在Nexus7版本中,代码运行良好,直到它得到4.2版本的更新,所以它不会成为设备问题。我已经在运行4.1.2的Nexus S和运行4.2的Nexus 4上进行了测试。它在Nexus S上运行良好,但在Nexus 4上没有 不幸的是

下面的代码是一个自定义视图-它绘制一个圆,根据比例添加槽口,并添加比例文本。这源于Mind机器人关于制作老式温度计的优秀教程

此代码在运行到Jelly Bean 4.1.2的设备上运行良好,但在4.2上中断。在4.2版本中,数字不再围绕圆圈绘制,而是分散在整个屏幕上。在Nexus7版本中,代码运行良好,直到它得到4.2版本的更新,所以它不会成为设备问题。我已经在运行4.1.2的Nexus S和运行4.2的Nexus 4上进行了测试。它在Nexus S上运行良好,但在Nexus 4上没有

不幸的是,作为一个新用户,我无法发布屏幕截图,我将尝试描述它:数字在拨号盘的前半部分正确显示,其余数字分散在屏幕上

我已经查看了4.2更改日志,但我看不到任何会导致这种情况发生的内容。我在网上寻找过类似的问题,但这些似乎都与硬件加速有关——我尝试过在清单中设置硬件加速的各种组合,但没有任何效果

我真的非常感谢任何关于可能导致这种情况发生的原因的意见

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.view.View;

public class AneroidView extends View {


    // drawing tools
    private RectF rimRect;

    private RectF faceRect;

    private Paint scalePaint;
    private RectF scaleRect;

    private Paint backgroundPaint; 
    // end drawing tools

    private Bitmap background; // holds the cached static part

    private int totalNotches = 130;
    private int incrementPerLargeNotch = 10;
    private int incrementPerSmallNotch = 1;
    private float degreesPerNotch = 360.0f / totalNotches;  

    private int scaleCenterValue = 1000; // the one in the top center (12 o'clock)
    private int scaleMinValue = 935;
    private int scaleMaxValue = 1065;


    public AneroidView(Context context) {
        super(context);
        init(context, null);
    }

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

    public AneroidView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(context, attrs);
    }

    private void init(Context context, AttributeSet attrs) {

        rimRect = new RectF(0.1f, 0.1f, 0.9f, 0.9f);

        float rimSize = 0.02f;
        faceRect = new RectF();
        faceRect.set(rimRect.left + rimSize, rimRect.top + rimSize, 
                 rimRect.right - rimSize, rimRect.bottom - rimSize);        


        scalePaint = new Paint();
        scalePaint.setStyle(Paint.Style.STROKE);
        scalePaint.setColor(Color.rgb(49, 79, 79));
        scalePaint.setStrokeWidth(0.005f);
        scalePaint.setAntiAlias(true);

        scalePaint.setTextSize(0.045f);
        scalePaint.setTypeface(Typeface.SANS_SERIF);
        scalePaint.setTextScaleX(0.8f);
        scalePaint.setTextAlign(Paint.Align.CENTER);        

        // The scale rectangular is located .10 from the outer rim.
        float scalePosition = 0.10f;

        scaleRect = new RectF();
        scaleRect.set(faceRect.left + scalePosition, faceRect.top + scalePosition,
                      faceRect.right - scalePosition, faceRect.bottom - scalePosition);

            }

    private void drawScale(Canvas canvas) {
        // Draw a large notch every large increment, and a small
        // notch every small increment.

        canvas.drawOval(scaleRect, scalePaint);

        canvas.save(Canvas.MATRIX_SAVE_FLAG);
        for (int i = 0; i < totalNotches; ++i) {
            float y1 = scaleRect.top;
            float y2 = y1 - 0.015f;
            float y3 = y1 - 0.025f;

            int value = notchToValue(i);

            if (i % (incrementPerLargeNotch/incrementPerSmallNotch) == 0) {
                if (value >= scaleMinValue && value <= scaleMaxValue) {
                    // draw a nick
                    canvas.drawLine(0.5f, y1, 0.5f, y3, scalePaint);

                    String valueString = Integer.toString(value);
                    // Draw the text 0.15 away from y3 which is the long nick.
                    canvas.drawText(valueString, 0.5f, y3 - 0.015f, scalePaint);
                }
            }
            else{
                if (value >= scaleMinValue && value <= scaleMaxValue) {
                    // draw a nick
                    canvas.drawLine(0.5f, y1, 0.5f, y2, scalePaint);
                }
            }

            canvas.rotate(degreesPerNotch, 0.5f, 0.5f);
        }
        canvas.restore();       
    }

    private int notchToValue(int value) {
        int rawValue = ((value < totalNotches / 2) ? value : (value - totalNotches)) * incrementPerSmallNotch;
        int shiftedValue = rawValue + scaleCenterValue;
        return shiftedValue;
    }


    private void drawBackground(Canvas canvas) {
        if (background != null)         
            canvas.drawBitmap(background, 0, 0, backgroundPaint);
    }

    @Override
    protected void onDraw(Canvas canvas) {      

        drawBackground(canvas);

        float scale = (float) getWidth();       
        canvas.save(Canvas.MATRIX_SAVE_FLAG);
        canvas.scale(scale, scale); 

        canvas.restore();

    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        regenerateBackground();
    }

    private void regenerateBackground() {
        // free the old bitmap
        if (background != null) {
            background.recycle();
        }

        background = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
        Canvas backgroundCanvas = new Canvas(background);
        float scale = (float) getWidth();       
        backgroundCanvas.scale(scale, scale);

        drawScale(backgroundCanvas);
    }
}
导入android.content.Context;
导入android.graphics.Bitmap;
导入android.graphics.Canvas;
导入android.graphics.Color;
导入android.graphics.Paint;
导入android.graphics.RectF;
导入android.graphics.Typeface;
导入android.util.AttributeSet;
导入android.view.view;
公共类anerodview扩展了视图{
//绘图工具
私人RectF rimRect;
私有RectF-faceRect;
私人油漆鳞片漆;
私人RectF;
私人涂料背景涂料;
//端部绘图工具
私有位图背景;//保存缓存的静态部分
私有整数总缺口=130;
私有整数增量PerlarGenotch=10;
private int incrementPerSmallNotch=1;
专用浮点数=360.0f/总槽口;
private int scaleCenterValue=1000;//位于顶部中间的一个(12点钟)
私有int scaleMinValue=935;
私有整数scaleMaxValue=1065;
公共anerodview(上下文){
超级(上下文);
init(上下文,null);
}
公共anerodview(上下文、属性集属性){
超级(上下文,attrs);
init(上下文,attrs);
}
公共anerodview(上下文上下文、属性集属性、int-defStyle){
超级(上下文、属性、定义样式);
init(上下文,attrs);
}
私有void init(上下文上下文、属性集属性){
rimRect=新的RectF(0.1f、0.1f、0.9f、0.9f);
浮子边缘尺寸=0.02f;
faceRect=新的RectF();
faceRect.集合(rimRect.left+rimSize,rimRect.top+rimSize,
rimRect.right-rimSize,rimRect.bottom-rimSize);
scalePaint=新油漆();
scalePaint.setStyle(绘制.样式.笔划);
scalePaint.setColor(Color.rgb(49,79,79));
刻度油漆设定行程宽度(0.005f);
scalePaint.setAntiAlias(true);
scalePaint.setTextSize(0.045f);
scalePaint.setTypeface(字体无衬线);
scalePaint.setTextScaleX(0.8f);
scalePaint.setTextAlign(绘制.Align.CENTER);
//矩形刻度距外缘0.10。
浮动刻度位置=0.10f;
scal直立=新的RectF();
scalePosition.set(faceRect.left+scalePosition,faceRect.top+scalePosition,
faceRect.right-缩放位置,faceRect.bottom-缩放位置);
}
专用void drawScale(画布){
//每大增量绘制一个大槽口,然后绘制一个小槽口
//每增加一个小缺口。
帆布。Draw椭圆形(鳞片竖立,鳞片画);
canvas.save(canvas.MATRIX\u save\u标志);
对于(int i=0;i如果(value>=scaleMinValue&&value=scaleMinValue&&valueAdd
scalePaint.setLinearText(true);

它将更好地工作,但文本间距可能看起来不好

请参见下面的线程:


我设法解决了这个问题,方法是使用scalePaint.setLinearText(true)在一个地方绘制文本字符,设置textSize>1.0f以解决紧排问题,然后使用canvas.scale(float,float)使字体大小合适。这很难看,也很痛苦,但对我来说很有效。

这里有另一个解决
紧排问题的方法
drawTextOnPath
非常有效

替换此:
//canvas.drawText(“Smushed text.”,0.5f,0.7F,myTextPaint);

为此:

private Path strightPath; <br>
strightPath = new Path(); <br>
strightPath.moveTo(0.1f, 0.5f);<br>
strightPath.lineTo(0.9f, 0.5f); <br>
canvas.drawTextOnPath("This text is not smushed together.", strightPath, 0.0f, 0.2f, myTextPaint);
专用路径strightPath;
strightPath=新路径();
strightPath.移动到(0.1f,0.5f);
strightPath.lineTo(0.9f,0.5f);
drawTextOnPath(“此文本未被涂抹在一起。”,strightPath,0.0f,0.2f,myTextPaint);
你发现了什么?它会崩溃吗?你是否在源代码周围散布了
Log.d
并显示在logcat中?答案可能隐藏在日志中。它不会崩溃,它运行时没有任何错误。问题是刻度没有正确显示。我已经查看了更改日志,我找不到任何可能的错误有效果;很明显,我遗漏了一些东西,但我被难住了。嗯,这是一个非常奇怪的效果-正如你所说,在4.1.2和4.2上进行测试后,新的操作系统版本似乎出现了问题。我还扫描了变更日志,找不到任何与此问题相关的内容。希望其他人能提供帮助,以下是一些屏幕截图来说明这个问题:)!!现场-正如你所说,现在它将绘制周围的比例