【问题标题】:Units in Rect classRect 类中的单位
【发布时间】:2014-01-14 20:21:02
【问题描述】:

我有 854X480 的安卓屏幕尺寸。

但是,当我使用drawRect(new Rect(0, 0, 570, 320), null) 时,它将适合整个屏幕。

MainActivity.java

public class MainActivity extends Activity
{
  @Override
  public void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    setContentView(new MainLayout(this));
  }
}
class MainLayout extends RelativeLayout
{
  public MainLayout(Context context)
  {
    super(context);
    setWillNotDraw(false);
  }
  @Override
  public void onDraw(Canvas canvas)
  {
    super.onDraw(canvas);
    setBackgroundColor(Color.WHITE);
    Paint paint = new Paint();
    paint.setColor(Color.BLACK);
    canvas.drawRect(new Rect(0, 0, 570, 320), paint);
  }
}

不应该是canvas.drawRect(new Rect(0, 0, 854, 480), paint) 会适合整个屏幕吗? 为什么我在 Rect 类中使用的单位(本例中为 (570, 320))与我的屏幕尺寸不同?

【问题讨论】:

    标签: android size screen units-of-measurement rect


    【解决方案1】:

    我认为这是因为您正在硬编码适合一个屏幕的像素。更好的方法是根据设备密度对它们进行缩放。方法如下。

    public static int convertDpToPixel(float dp) {  
        return (int) (dp * (DEVICE_DENSITY_DPI / 160f));
    }
    

    在应用程序级别将 DEVICE_DENSITY_DPI 定义为全局对象:

    DisplayMetrics metrics = new DisplayMetrics();
    WindowManager windowManager = (WindowManager)getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
    windowManager.getDefaultDisplay().getMetrics(metrics);
    
    DEVICE_DENSITY_DPI = metrics.densityDpi;    
    

    然后,如下使用:

    class MainLayout extends RelativeLayout
    {
      final int WIDTH = convertDpToPixel(570);
      final int HEIGHT = convertDpToPixel(320);      
    
      public MainLayout(Context context)
      {
        super(context);
        setWillNotDraw(false);
      }
    
      @Override
      public void onDraw(Canvas canvas)
      {
        super.onDraw(canvas);
        setBackgroundColor(Color.WHITE);
        Paint paint = new Paint();
        paint.setColor(Color.BLACK);
        canvas.drawRect(new Rect(0, 0, WIDTH, HEIGHT), paint);
      }
    }
    

    现在值会根据设备的宽度和高度自动改变,同时确保布局 MainLayout 具有属性 match_parent。

    希望对您有所帮助。 :)

    【讨论】:

    • 非常感谢您的解释
    猜你喜欢
    • 1970-01-01
    • 2014-04-29
    • 1970-01-01
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-02
    相关资源
    最近更新 更多