2013-02-15 67 views
0

我尝试为我的应用程序制作一个自定义RatingBar,该应用程序对每个4星都有不同的图像。 使用以下onDraw方法,它对我的​​手机非常有用。RatingBar(或位置和大小)中星星的边距/填充?

public class MyBar extends RatingBar { 

    private int[] starArrayColor = { R.drawable.star_1_color, R.drawable.star_2_color, R.drawable.star_3_color, R.drawable.star_4_color }; 
    private int[] starArrayGrey = { R.drawable.star_1_grey, R.drawable.star_2_grey, R.drawable.star_3_grey, R.drawable.star_4_grey }; 

    (...) 

    @Override 
    protected synchronized void onDraw(Canvas canvas) { 
     int stars = getNumStars(); 
     float rating = getRating(); 
     float x = 10; 

     for (int i=0;i<stars;i++) { 
      Bitmap bitmap; 
      Resources res = getResources(); 

      Paint paint = new Paint(); 
      paint.setAntiAlias(true); 
      paint.setFilterBitmap(true); 
      paint.setDither(true); 

      if ((int) rating-1 == i) { 
       paint.setAlpha(255); 
       bitmap = BitmapFactory.decodeResource(res, starArrayColor[i]); 
      } else { 
       paint.setAlpha(70); 
       bitmap = BitmapFactory.decodeResource(res, starArrayGrey[i]); 
      } 

      Bitmap scaled = Bitmap.createScaledBitmap(bitmap, 75, 75, true); 
      canvas.drawBitmap(scaled, x, 12, paint); 
      x += 96; 
     } 
    } 
} 

但是x/y位置和图像大小的“计算”成了!它只是试验和错误,以获得正确的坐标...

我如何计算位置/大小等,让它在每个设备上正常工作?

在AbsSeekBar/Progressbar的来源中,我找到了一些名为mPaddingTop,mPaddingBottom等的变量。有没有办法获得这些值?

回答

0

位图有一个getWidth和getHeight函数。您可以使用这些来计算位图的大小。然后你可以根据它来放置它们(无论你想使用什么填充)。

+0

你能解释一下吗?我应该调用哪个对象getWidth/getHeight?我需要将这颗星作为一个对象,但是我从哪里得到这些? – Oliver 2013-02-15 19:23:58

+0

要绘制的位图对象。虽然由于您通过createScaledBitmap从原始尺寸缩放了它,但您知道它将精确到75x75,因此您无需猜测。对于项目之间的填充量,您也可以选择。最好的办法是选择一个尺寸看起来不错的尺寸,然后乘以系统dpi来获取像素数量,并在每个元素之间使用它。 – 2013-02-15 19:33:12

+0

我的位图的大小并不重要。 75x75是我需要计算的,因为它只能在我的手机上使用。但不在其他设备上。 – Oliver 2013-02-15 19:58:53