2015-02-24 17 views
1

я уже два опубликовать вопрос, связанный этим (плз передать этот custom piechart 1 и это custom pie chart 2), но не получает ответа, в конце концов я разработать самостоятельно, но застрять в какой-то момент.Android: метод canvas.drawBitmap() не работает должным образом

Мне нужно создать линии между обнаженной областью, как вы можете видеть на изображении .for внутреннего круга я использовал canvas.drawArc() .for внешнего круга я использовал canvas.drawCircle() и для средних линий я использовал метод canvas.drawBitmap() с углом отличается .Йтесь внутренним и внешним кругом, нарисованным правильно, но для средней дуги только первые две битмап/дуги рисуются правильно, но оставшиеся два не находятся в их точном положении.

Я использовал тот же код для рисования всех растровых изображений/дуг, но не получал точный результат. Я застреваю то, что является точной проблемой. Помогла, спасибо заранее.

вы можете видеть, что мой выход

здесь .. screenshot

Услышь мой 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);   
    } 

Это мой 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();  

    } 
+0

90 градусов/(8 + 2 + 4 + 2) = 5.625, а не 5.60 – samgak

+0

этот расчет предназначен для вычисления угла внутреннего круга, а не для дуги. это влияние на дуги? кроме этого я попытался 5.625, но не повезло @samgak – Radhey

+0

** 1 ** 'для средних строк я использовал canvas.drawBitmap()' ** ПОЧЕМУ **? не могли бы вы использовать 'canvas.drawLine()' (http://developer.android.com/reference/android/graphics/Canvas.html#drawLine%28float,%20float,%20float,%20float,%20android.graphics .Paint% 29)? ** 2 ** Вместо того, чтобы сходить с ума, изобретая колесо, вы не могли бы использовать бесплатную стороннюю библиотеку, такую ​​как [aChartEngine] (http://www.achartengine.org/content/demo.html)? –

ответ

0

Спасибо всем. наконец я сделал это с помощью замены этого материала Rotating Image on A canvas

matrix.postRotate(_angle1);  
canvas.drawBitmap(myBitmap1, matrix, null); 

с этим

Matrix matrix1 = new Matrix(); 
matrix1.setRotate(_angle1, 0, 0); 
canvas.drawBitmap(myBitmap1, matrix1, null); 

здесь, во-первых, вы должны изменить значение, как это,

float myAngle = 0; 
myAngle = ((90 * values.get(i))/16); 
Смежные вопросы