Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:canvas.drawBitmap()方法工作不正常_Android_Canvas_Pie Chart - Fatal编程技术网

Android:canvas.drawBitmap()方法工作不正常

Android:canvas.drawBitmap()方法工作不正常,android,canvas,pie-chart,Android,Canvas,Pie Chart,我已经发布了两个与此相关的问题(请参考此 这)但没有得到答案,最后我发展了自己的,但在某个点上卡住了 我需要在绘图区域之间创建线,如图中所示。对于内圈,我使用了canvas.drawArc()。对于外圈,我使用了canvas.drawCircle(),对于中间线,我使用了canvas.drawBitmap()方法,角度不同。这里正确绘制了内圈和外圈,但对于中间弧,只有前两个位图/圆弧正确绘制,但其余两个位图/圆弧不在其确切位置 我使用相同的代码绘制所有位图/圆弧,但没有得到精确的输出。我被卡住了

我已经发布了两个与此相关的问题(请参考此 这)但没有得到答案,最后我发展了自己的,但在某个点上卡住了

我需要在绘图区域之间创建线,如图中所示。对于内圈,我使用了
canvas.drawArc()
。对于外圈,我使用了
canvas.drawCircle()
,对于中间线,我使用了
canvas.drawBitmap()
方法,角度不同。这里正确绘制了内圈和外圈,但对于中间弧,只有前两个位图/圆弧正确绘制,但其余两个位图/圆弧不在其确切位置

我使用相同的代码绘制所有位图/圆弧,但没有得到精确的输出。我被卡住了,到底是什么问题。需要帮助,提前谢谢

你可以看到我的输出

这里

Hear是我的onCreate(),我在其中生成并设置视图

 public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        lv1 = (LinearLayout) findViewById(R.id.linear);     
        matrix = new Matrix();  
        MyView myview = new MyView(this);
        lv1.addView(myview);
    }
这是我要生成的customview类

    public class MyView extends View {

    private Paint p ,paint,paint_text;
    private int startX;
    private int startY;
    private int radius;
    private ArrayList<Integer> colors;
    private ArrayList<Float> values;
    Bitmap bitmap;
    Context mContext;
    RectF rectF , rectF2 ;
    public MyView(Context context) {
        super(context);
        mContext = context;
        p = new Paint();
        p.setAntiAlias(true);

        colors = new ArrayList<Integer>();
        values = new ArrayList<Float>();

        Display display = getWindowManager().getDefaultDisplay(); 
        width1 = display.getWidth();
        height1 = display.getHeight();      

        startX = 0 ;
        startY = 0;
        radius = (int) (width1/2);             

        colors.add(Color.RED);
        colors.add(Color.BLUE);
        colors.add(Color.YELLOW);
        colors.add(Color.GREEN);            
        values.add(8f);
        values.add(2f); 
        values.add(4f);         
        values.add(2f);         
    }
公共类MyView扩展了视图{
私人绘画p、绘画、绘画文字;
私人int startX;
私人int startY;
私有整数半径;
私有数组列表颜色;
私有数组列表值;
位图;
语境;
RectF RectF,rectF2;
公共MyView(上下文){
超级(上下文);
mContext=上下文;
p=新油漆();
p、 setAntiAlias(真);
颜色=新的ArrayList();
值=新的ArrayList();
Display Display=getWindowManager().getDefaultDisplay();
宽度1=display.getWidth();
height1=display.getHeight();
startX=0;
startY=0;
半径=(整数)(宽度1/2);
颜色。添加(颜色。红色);
颜色。添加(颜色。蓝色);
颜色。添加(颜色。黄色);
颜色。添加(颜色。绿色);
增加(8f);
添加(2f);
添加(4f);
添加(2f);
}
这是我的onDraw()方法

protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);           
        float _angle1 = 0 ,_angle2  = 0 ,_angle3 = 0 , _angle4 =0;      

        Bitmap myBitmap1 = BitmapFactory.decodeResource(getResources(),R.drawable.saperate_line);           
        bitmap = Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(), Bitmap.Config.ARGB_8888);

        Canvas c = new Canvas(bitmap);

        float offset = 0;       
        float angle = (float) 5.60 ;            
        matrix.reset();
        canvas.translate(0,canvas.getHeight()); //reset where 0,0 is located
        canvas.scale(1,-1); // for scaling 

        rectF = new RectF();
        rectF.set(-(getStartX() + getRadius()), -(getStartY() + getRadius()), getStartX() + getRadius(),getStartY() + getRadius());

       //for creating outer circle using canvas.drawCircle-----------
        paint = new Paint();
        paint.setColor(Color.GREEN);        
        paint.setStrokeWidth(2);            
        paint.setStyle(Paint.Style.STROKE);         
        canvas.drawCircle(0, 0, (float) (width1/(1.4)), paint); 

       //for creating inner circle using canvas.drawArc-----------
        for (int i = 0; i < values.size(); i++) {
             p.setColor(colors.get(i));

            if (i == 0) {                   
             canvas.drawArc(rectF, offset, values.get(i) * angle, true, p);   
             _angle1 = ((offset+(values.get(i) * angle)))/2;                    
             matrix.postRotate(_angle1);    
             canvas.drawBitmap(myBitmap1, matrix, null);          

            } 

           if(i == 1){              
              canvas.drawArc(rectF, offset, values.get(i) * angle, true, p);                
              _angle2 = ((offset + (values.get(i) * angle)))/2;
              matrix.postRotate(_angle2);
               canvas.drawBitmap(myBitmap1, matrix, null);
             }  

           if(i == 2){
            canvas.drawArc(rectF, offset, values.get(i) * angle, true, p);          
            _angle3 = ((offset + (values.get(i) * angle)))/2;

            // _angle3 = (offset + angle);                  
             matrix.postRotate(_angle3);
             canvas.drawBitmap(myBitmap1, matrix, null);        
              } 

           if (i == 3){                                     
             canvas.drawArc(rectF, offset, values.get(i) * angle, true, p); 
             _angle4 = ((offset + (values.get(i) * angle)))/2;                
             matrix.postRotate(_angle4);                    
             canvas.drawBitmap(myBitmap1, matrix, null);
                }                        

            offset += (values.get(i) * angle);
            Log.e("new offset :: ","****************************"+offset);

        }
       canvas.save();    

    }
受保护的void onDraw(画布){
super.onDraw(帆布);
浮动角度1=0,角度2=0,角度3=0,角度4=0;
位图myBitmap1=BitmapFactory.decodeResource(getResources(),R.drawable.saperate_行);
bitmap=bitmap.createBitmap(canvas.getWidth()、canvas.getHeight()、bitmap.Config.ARGB_8888);
画布c=新画布(位图);
浮动偏移=0;
浮动角度=(浮动)5.60;
matrix.reset();
canvas.translate(0,canvas.getHeight());//重置0,0所在的位置
scale(1,-1);//用于缩放
rectF=新的rectF();
rectF.set(-(getStartX()+getRadius()),-(getStartY()+getRadius()),getStartX()+getRadius(),getStartY()+getRadius());
//用于使用canvas.drawCircle创建外圆-----------
油漆=新油漆();
油漆。设置颜色(颜色。绿色);
油漆。设置行程宽度(2);
绘制.设置样式(绘制.样式.笔划);
画布。画圈(0,0,(浮动)(宽度1/(1.4)),油漆);
//用于使用canvas.drawArc创建内圈-----------
对于(int i=0;i
感谢大家。 最后我用替换这些东西的方法完成了

用这个

Matrix matrix1 = new Matrix();
matrix1.setRotate(_angle1, 0, 0);
canvas.drawBitmap(myBitmap1, matrix1, null);
这里,首先您应该像这样更改值

 float myAngle = 0;
 myAngle = ((90 * values.get(i)) / 16);

90度/(8+2+4+2)=5.625,而不是5.60此计算用于计算内圈的角度,而不是圆弧。这对圆弧有影响吗?除此之外,我尝试了5.625,但没有运气@samgak1
对于中间线,我使用了canvas.drawBitmap()
为什么?您不能使用
canvas.drawLine()
()?2你不能使用免费的第三方库,而不是疯狂地重新发明轮子吗?我试过了,但无法在此级别自定义aChartEnfine。关于canvas.drawLine(),它接受(startX、startY、stopX、stopY、paint)作为一个论点,我如何计算这个参数的运行时间,它正好适合我的图表特定部分(如蓝色、绿色等)的一半?——@dergolem不能很清楚地抓住你,我没有使用半径/2。我想你告诉过我关于_angle1=((offset+(values.get(i)*angle))/2;这是用于从(起始弧点+结束弧点)/2.这给了我绘图位的准确角度m
 float myAngle = 0;
 myAngle = ((90 * values.get(i)) / 16);