码迷,mamicode.com
首页 > 其他好文 > 详细

获取像素密度、屏幕高度、状态栏、标题栏,屏幕截图

时间:2016-07-01 22:46:29      阅读:404      评论:0      收藏:0      [点我收藏+]

标签:


演示效果
奇酷1080P
技术分享
华为1080P
技术分享
华为720P
技术分享

屏幕像素参数相关信息表格
          像素密度   每英寸像素数   分辨率           分辨率别称      默认图标大小
xxhdpi   3        480   1080*1920   1080P    144*144   重点关注
xhdpi    2        320    720*1280     720P      96*96      适配基准
hdpi     1.5      240    480*800      WVGA    72*72  
mdpi    1.0      160    320*480      HVGA     48*48      基准
ldpi      0.75    120    240*320      QVGA     36*36

字体单位
1、TextView.setTextSize默认传入的单位是sp,仅仅这个的单位默认是sp,其他都是px
2、TextView.getTextSize返回值是px,Paint.setTextSize传入的也是px
3、TextView有一个可以指定单位的设置字体大小的方法setTextSize(int unit, int size)
第一个参数可设置如下静态变量:
  • TypedValue.COMPLEX_UNIT_PX : Pixels
  • TypedValue.COMPLEX_UNIT_SP : Scaled Pixels
  • TypedValue.COMPLEX_UNIT_DIP : Device Independent Pixels
setTextSize(TypedValue.COMPLEX_UNIT_PX, getTextSize());//注意:setTextSize默认单位是SP,而getTextSize()默认单位是PX  

名词解释
名词解释
  • Px(像素Pixel) 不同设备上显示时像素数不会变,比如指定控件的长度是100px,那不管分辨率是多少控件长度都是100px。也正是因为如此才产生了屏幕适配问题。
  • Screen Size(屏幕尺寸) 一般所说的手机屏幕大小如5.0英寸,都是指的对角线的长度,而不是手机面积。
  • Resolution(分辨率) 在屏幕上显示的物理像素总和。比如分辨率是720*1280,则指设备垂直方向有1280个像素点,水平方向有720个像素点。需要注意的是:尽管分辨率通常用宽x高表示,但分辨率并不意味着具体的屏幕长宽比,比如分辨率为720*1280的手机屏幕宽高比不一定是720:1280,但是为了显示效果和谐,两者一般都是一致的。
  • Density(密度) 指单位英寸中的像素数。DisplayMetrics类中属性density的值即为此值,可用于px与dip的互相转换
  • Dpi(像素密度dots per inch ) 指每英寸中的像素数。dp是一个与密度无关的像素,在不同的像素密度的设备上会自动适配,在逻辑尺寸上,与一个位于像素密度为 160DPI 的屏幕上的像素是一致的,在运行的时候,平台会以目标屏幕的密度作为基准,处理所有需要的DIP缩放操作。假定设备分辨率为320*240,屏幕长2英寸宽1.5英寸,dpi=320/2=240/1.5=160,此160dpi表示手机水平或垂直方向上每英寸距离有160个像素点。要把DIP像素转换为屏幕像素,可以用这样一个简单的公式: pixels = dips * (density / 160)。
  • Dip(设备独立像素Device-independent pixel) 同dp,不同设备有不同的显示效果,这个和设备硬件有关,不依赖像素。dip和具体像素值的对应公式是dip值 =设备密度/160* pixel值,可以看出在dpi为160dpi的设备上1px=1dip
  • Sp(放大像素ScaledPixels) 主要用于字体显示(best for textsize)。根据 google 的建议,TextView 的字号最好使用 sp 做单位,而且查看TextView的源码可知 Android 默认使用 sp 作为字号单位。

Activity
public class MainActivity extends Activity {
    private TextView tv_info;
    public static final String FILE_PATH = Environment.getExternalStorageDirectory().getAbsolutePath();
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        tv_info = new TextView(this);
        setContentView(tv_info);
        tv_info.setText("" + DensityUtils.getStatusBarHeight(this));//奇酷72。华为75
        tv_info.append("\n" + DensityUtils.getDisplayMetrics(this));//奇酷2.875。华为3.0
        tv_info.append("\n" + DensityUtils.dp2px(this, 10.3f));
        tv_info.append("\n" + DensityUtils.px2dp(this, 10.3f));
        tv_info.append("\n" + DensityUtils.sp2px(this, 10.3f));
        tv_info.append("\n" + DensityUtils.px2sp(this, 10.3f));
        tv_info.append("\n" + DensityUtils.getScreenWidth(this) + "-" + DensityUtils.getScreenWidth2(this));
        tv_info.append("\n屏幕高度:" + DensityUtils.getScreenHeight(this));//奇酷1920。华为1794
        tv_info.append("\n状态栏高度:" + DensityUtils.getStatusBarHeight(this));//奇酷72。华为75
        //需要 root 权限,且可能会被360报毒
        //        DensityUtils.saveBitmap2Pic(DensityUtils.snapShotWithStatusBar(this), FILE_PATH + "1.png");
        //        DensityUtils.saveBitmap2Pic(DensityUtils.snapShotWithoutStatusBar(this), FILE_PATH + "2.png");
    }
    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        if (hasFocus) {
            tv_info.append("\n标题栏高度:" + DensityUtils.getTitleBarHeight(this));//奇酷161。华为168
        }
    }
}

工具类
public class DensityUtils {
    //******************************************************************************************
    //                                                                                    单位转换
    //******************************************************************************************
    /**像素密度*/
    public static float getDisplayMetrics(Context context) {
        return context.getResources().getDisplayMetrics().density;
    }
    /**  dp 转成为 px     */
    public static int dp2px(Context context, float dpValue) {
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dpValue, context.getResources().getDisplayMetrics());
    }
    /**  px 转成为 dp     */
    public static int px2dp(Context context, float pxValue) {
        return (int) (pxValue / getDisplayMetrics(context) + 0.5f);
    }
    /** sp转px */
    public static int sp2px(Context context, float spVal) {
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, spVal, context.getResources().getDisplayMetrics());
    }
    /** px转sp */
    public static float px2sp(Context context, float pxVal) {
        return (pxVal / context.getResources().getDisplayMetrics().scaledDensity);
    }
    //******************************************************************************************
    //                                                                                屏幕宽高
    //******************************************************************************************
    /**  获取屏幕宽  */
    public static int getScreenWidth(Context context) {
        DisplayMetrics metric = new DisplayMetrics();
        ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getMetrics(metric);
        return metric.widthPixels;
    }
    /** 获取屏幕高,包含状态栏,但不包含某些手机最下面的【HOME键那一栏】,如1920屏幕只有1794  */
    public static int getScreenHeight(Context context) {
        DisplayMetrics metric = new DisplayMetrics();
        ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getMetrics(metric);
        return metric.heightPixels;
    }
    /**  获取屏幕宽  */
    public static int getScreenWidth2(Context context) {
        Point point = new Point();
        ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getSize(point);
        return point.x;
    }
    /**  获取屏幕高,包含状态栏,但不包含某些手机最下面的【HOME键那一栏】,如1920屏幕只有1794  */
    public static int getScreenHeight2(Context context) {
        Point point = new Point();
        ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getSize(point);
        return point.y;
    }
    //******************************************************************************************
    //                                                                        状态栏、标题栏
    //******************************************************************************************
    /** 状态栏高度,单位px,一般为25dp  */
    public static int getStatusBarHeight(Context context) {
        int height = 0;
        int resourceId = context.getResources().getIdentifier("status_bar_height""dimen""android");
        if (resourceId > 0) {
            height = context.getResources().getDimensionPixelSize(resourceId);
        }
        return height;
    }
    /** 状态栏高度,单位px,【注意】要在onWindowFocusChanged中获取才可以,不建议采用这种方式获取 */
    public static int getStatusBarHeight2(Activity activity) {
        Rect rect = new Rect();
        //DecorView是Window中的最顶层view,可以从DecorView获取到程序显示的区域,包括标题栏,但不包括状态栏。所以状态栏的高度即为显示区域的top坐标值
        activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);
        return rect.top;
    }
    /**标题栏的高度,【注意】要在onWindowFocusChanged中获取才可以,不建议采用这种方式获取*/
    public static int getTitleBarHeight(Activity activity) {
        int contentTop = activity.getWindow().findViewById(Window.ID_ANDROID_CONTENT).getTop();
        return contentTop - getStatusBarHeight(activity);
    }
    //******************************************************************************************
    //                                                                            屏幕截图
    //******************************************************************************************
    /** 获取当前屏幕截图,包含状态栏,需要 root 权限,且可能会被360【报毒】 */
    public static Bitmap snapShotWithStatusBar(Activity activity) {
        View view = activity.getWindow().getDecorView();
        view.setDrawingCacheEnabled(true);
        view.buildDrawingCache();
        Bitmap bmp = view.getDrawingCache();
        int width = getScreenWidth(activity);
        int height = getScreenHeight(activity);
        Bitmap bp = null;
        bp = Bitmap.createBitmap(bmp, 0, 0, width, height);
        view.destroyDrawingCache();
        return bp;
    }
    /** 获取当前屏幕截图,不包含状态栏,需要 root 权限,且可能会被360【报毒】*/
    public static Bitmap snapShotWithoutStatusBar(Activity activity) {
        View view = activity.getWindow().getDecorView();
        view.setDrawingCacheEnabled(true);
        view.buildDrawingCache();
        Bitmap bmp = view.getDrawingCache();
        Rect frame = new Rect();
        activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
        int statusBarHeight = frame.top;
        int width = getScreenWidth(activity);
        int height = getScreenHeight(activity);
        Bitmap bp = null;
        bp = Bitmap.createBitmap(bmp, 0, statusBarHeight, width, height - statusBarHeight);
        view.destroyDrawingCache();
        return bp;
    }
    /** 保存bitmap为图片 */
    public static void saveBitmap2Pic(Bitmap bitmap, String fileName) {
        File file = new File(fileName);
        try {
            FileOutputStream out = new FileOutputStream(file);
            bitmap.compress(Bitmap.CompressFormat.PNG, 90, out);
            out.flush();
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}





获取像素密度、屏幕高度、状态栏、标题栏,屏幕截图

标签:

原文地址:http://www.cnblogs.com/baiqiantao/p/5634279.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!