android gallery中,怎么获取当前的图片并得到图片的高和宽的长度谢谢。

android gallery中,怎么获取当前的图片并得到图片的高和宽的长度谢谢。,第1张

一些术语

Screen Size 屏幕尺寸:

实际的物理尺寸,以屏幕的对角线为准(包括通知栏?)

将所有的实际尺寸分为四个广义的尺寸:small(小),normal(正常),large(大),extra large(特大)

Density 屏幕密度:

屏幕的屋里面积内的像素数量,通常指dpi(每英寸点数)

small的屏幕密度比normal或large在一个给定的物理面积内具有较少的像素

将所有实际密度分为四个广义的密度:low(低),medium(中等),high(高),extra high(超高)

方向:

从用户的角度来看,屏幕的方向是横向或纵向,也就是屏幕的比例是高或者宽。

Resolution 分辨率:

在屏幕上的像素总数。在支持多个屏幕时,应用程序不直接与分辨率相关,应用程序应该只与屏幕大小和密度相关。

DP(密度无关的像素) Density-independent pixel:

在定义UI布局时应该使用的虚拟像素单元,它用一种密度无关的方式来表达布局尺寸或位置。

Aspect ratio 屏幕长宽比

长宽比是屏幕的物理宽度与物理高度的比例关系。应用程序可以通过使用限定的资源来为指定的长宽比提供屏幕布局资源。

设计和编码

视觉在根据交互原型进行设计的时候,可以考虑以mdpi,也就是320x480为蓝本进行设计,因为Android一般采用dp为单位,而我们设计的时候一般是px为单位的,这个就涉及到一个单位转换的问题,而在mdpi下,px和dp是1:1的关系,这样在标注坐标的时候能够很方便的进行单位转换,例如我们以320x480为蓝本的话,在photoshop测量的间距为10px,我们在给到RD时的坐标可以直接标注为10dp;因为dp的单位是可以程序自己去适配不用dpi屏幕的,所以就算设计三套不同dpi的图,一般也只用对mdpi的设计图进行坐标定位,这个坐标的标注可以用在所有dpi的资源上

Android资源文件

drawable-hdpi里面存放高分辨率的,如WVGA (480x800),FWVGA (480x854)

drawable-mdpi里面存放中等分辨率的,如HVGA (320x480)

drawable-ldpi里面存放低分辨率的,如QVGA (240x320)

有两种方式:(获取到的大小准确度与手机的类型有关,google手机你还需要加上底部栏)

1

WindowManager wm = (WindowManager) getContext()

getSystemService(ContextWINDOW_SERVICE);

int width = wmgetDefaultDisplay()getWidth();

int height = wmgetDefaultDisplay()getHeight();

2

WindowManager wm = thisgetWindowManager();

int width = wmgetDefaultDisplay()getWidth();

int height = wmgetDefaultDisplay()getHeight();

Android屏幕密度(Density)和分辨率概念

density值表示每英寸有多少个显示点,与分辨率是两个概念。

不同density下屏幕分辨率信息:

480800的WVGA(density=240)

density=120时 屏幕实际分辨率为240400 (两个点对应一个分辨率)

横屏是屏幕宽度400px 或者800dip,工作区域高度211px或者480dip

竖屏时屏幕宽度240px或者480dip,工作区域高度381px或者775dip

density=160时 屏幕实际分辨率为320px533px (3个点对应两个分辨率)

状态栏和标题栏高个25px或者25dip

横屏是屏幕宽度533px 或者800dip,工作区域高度295px或者480dip

竖屏时屏幕宽度320px或者480dip,工作区域高度508px或者775dip

density=240时 屏幕实际分辨率为480px800px (一个点对于一个分辨率)

状态栏和标题栏高个38px或者25dip

横屏是屏幕宽度800px 或者800dip,工作区域高度442px或者480dip

竖屏时屏幕宽度480px或者480dip,工作区域高度762px或者775dip

DisplayMetricsmetrics = new DisplayMetrics(); getWindowManager()getDefaultDisplay()getMetrics;

构造函数DisplayMetrics 不需要传递任何参数;调用getWindowManager()之后,会取得现有Activity 的Handle ,此时,getDefaultDisplay() 方法将取得的宽高维度存放于DisplayMetrics 对象中,而取得的宽高维度是以像素为单位(Pixel) ,“像素”所指的是“绝对像素”而非“相对像素”。

其实现代码如下:

private TextView textView; public void onCreate(Bundle savedInstanceState) { superonCreate(savedInstanceState); setContentView(Rlayoutmain); DisplayMetrics displayMetrics = newDisplayMetrics(); getWindowManager()getDefaultDisplay()getMetrics(displayMetrics); String string= "手机屏幕分辨率为:" + displayMetricswidthPixels + "x" + displayMetricsheightPixels; textView =(TextView) findViewById(RidtextView); textViewsetText(string); }

下面介绍下我发现的另一种方法,那就是Display类,通过查找API可知,该类在androidview包里,描述为:Providesinformation about the display size and density。

使用方法如下:

private TextView textView; public void onCreate(Bundle savedInstanceState) { superonCreate(savedInstanceState); setContentView(Rlayoutmain); Display display =getWindowManager()getDefaultDisplay(); String string = "手机的屏幕分辨率为:" + displaygetWidth() + "x" + displaygetHeight(); textView = (TextView) findViewById(RidtextView); textViewsetText(string); }

内容整理自网络。

在做内存优化的时候,我们发现除了解决内存泄露问题,剩下的就只有想办法减少真实的内存占用。而在App中,大部分内存可能被我们占用了,所以减少的内存占用可以带来直接的效果。本文就简单介绍一张到底占用多少内存,我们先假设我们有一张时 600 800 的,占用空间大小假设是 100KB。

内存大小跟占用空间大小有什么关系?

占用空间的大小不是占用内存的大小,一些初学者可能会误解一下。占用空间是在磁盘上占用的空间,内存大小是加载到内存中占用的内存大小。两个只是单位是一样的,本质不是一个概念。

一张到底占用多少内存呢?(ARGB_8888编码)

1 占用内存的计算公式: 高度 宽度 一个像素占用的内存大小

2 所以上面的占用内存是:800 600 4 byte = 1875KB = 183M

上面的计算公式中,为什么是4byte呢?文章后面有总结哦

所在目录对内存的影响?

在Android中,的存放目录和手机的屏幕密度影响最终的大小,举个例子:

假设我们的放到 xhdpi 目录下,那么我们本文中的占用的内存大小如下:

屏幕密度为2的设备:800 600 4byte = 183M

屏幕密度为3的设备:800 15 600 15 4byte = 183 225M = 412M

所以,计算占用内存大小的时候,要考虑所在的目录跟设备密度,这两个因素其实影响的是的高宽,android会对进行拉升跟压缩。

总结

1 确实很占用内存,内存优化先考虑内存占用;

2 一定要避免使用大,这就是9图很有用的原因之一;

3 的大小对内存的影响是正比关系;

4 本文只是简单的告知读者怎么计算的内存大小。

大图: 440 336    小图: 220 168 资源目录: xhdpi

小图的高宽都是大图的1/2-->小图是原图的1/4

界面效果:

测试设备: Coolpad   8676-M01   51   density=20

测试前准备 *** 作: 同一款设备,设置前后多次调用gc直到内存短时间内保持稳定不再变化

内存使用情况: 下图依次是 初始内存,大图内存,小图内存

大图占用内存: 1123 MB - 1066 MB = 057 MB

小图占用内存: 1081 MB - 1066 MB = 015 MB

大图小图内存关系: 015 MB 4 = 060 MB 约等于 057 MB (这是统计工具的误差,理论上就是相等的)

同样的方式在另外一台设备小米4c上得到的结果如下:

测试设备: Xiaomi   Mi-4c   V8210LXKCNDL   511   density=30

大图占用内存: 1322 MB - 1195 MB = 127 MB

小图占用内存: 1227 MB - 1195 MB = 032 MB

大图小图内存关系: 032 MB 4 = 128 MB 约等于 127 MB

结论: 由此可见大图比小图占用更多的内存,大小(分辨率)与占用内存成正比关系

备注: 在硬盘上占用的磁盘空间大小,与在内存中占用的内存大小完全不一样,不是一个概念,不要混淆

根据上文中大小与内存的关系,可以更加深刻的理解Android中9的作用,它不但能减少apk的体积,还能减少占用内存。

有些时候我们根本不需要,而是自己绘制背景,可以在自定义View的onDraw中绘制背景,当然最方便的还是使用系统的Drawable,绘制部分交给系统去完成。

下面测试与Drawable的内存占用对比

原始大小: 482 482

界面效果:

测试设备: Xiaomi   Mi-4c   V8210LXKCNDL   511

测试前准备 *** 作: 同一款设备,设置背景前后多次调用gc直到内存短时间内保持稳定不再变化

内存使用情况: 下图依次是 初始内存,使用占用的内存,使用Drawable占用的内存,使用onDraw绘制占用的内存

使用占用内存: 1397 MB - 1197 MB = 200 MB

使用Drawable占用内存: 1197 MB - 1197 MB = 000 MB (不会是0,有误差,只是很少)

使用onDraw绘制占用内存: 1198 MB - 1197 MB = 001 MB

结论: 绘制背景,或者使用系统提供Drawable作为背景,会大大减少内存占用

Drawable

参考资料:

Drawable实战解析:Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)

Android GradientDrawable(shape标签定义)静态使用和动态使用(圆角,渐变实现)

“让你的最小化”一节中描述的方法:使用尽可能小的图,使用9,自己绘制背景或者使用Drawable来绘制背景

加载大时需要对进行压缩,使用等比例压缩方法直接在内存中处理

这样做要注意的是,质量会变差,inSampleSize设置的值越大,质量就越差。

有时候我们取得一张,也许只是为了获得这个的一些信息,比如的width、height等信息,不需要显示到界面上,这个时候我们可以不把加载到内存中。

由于Android外层是使用java,而底层使用的是C语言为对象分配的内存空间。所以我们的外部虽然看起来释放了,但里层却并不一定完全释放了,我们使用完后最好再释放掉里层的内存空间。

RGB(ARGB)

RGB色彩模式是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是目前运用最广的颜色系统之一。在Android中还有包含透明度Alpha的颜色模型,即ARGB。

YUV

YUV,分为三个分量,“Y”表示明亮度(Luminance或Luma),也就是灰度值;而“U”和“V” 表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。

YUV的原理是把亮度与色度分离,研究证明,人眼对亮度的敏感超过色度。利用这个原理,可以把色度信息减少一点,人眼也无法查觉这一点。

主要用于电视系统以及模拟视频领域,它将亮度信息(Y)与色彩信息(UV)分离,没有UV信息一样可以显示完整的图像,只不过是黑白的,这样的设计很好地解决了彩色电视机与黑白电视的兼容问题

YUV的存储中与RGB格式最大不同在于,RGB格式每个点的数据是连继保存在一起的。即R,G,B是前后不间隔的保存在2-4byte空间中。而YUV的数据中为了节约空间,U,V分量空间会减小。每一个点的Y分量独立保存,但连续几个点的U,V分量是保存在一起的,(反正人眼一般也看不出区别)这几个点合起来称为macro-pixel, 这种存储格式称为Packed格式。另外一种存储格式是把一幅图像中Y,U,V分别用三个独立的数组表示。这种模式称为planar模式。

CMYK

  CMYK也称作印刷色彩模式,顾名思义就是用来印刷的。印刷四分色模式是彩色印刷时采用的一种套色模式,利用色料的三原色混色原理,加上黑色油墨,共计四种颜色混合叠加,形成所谓“全彩印刷”。四种标准颜色是:

CMYK和RGB相比有一个很大的不同:RGB模式是一种发光的色彩模式,你在一间黑暗的房间内仍然可以看见屏幕上的内容;CMYK是一种依靠反光的色彩模式,我们是怎样阅读报纸的内容呢?是由阳光或灯光照射到报纸上,再反射到我们的眼中,才看到内容。它需要有外界光源,如果你在黑暗房间内是无法阅读报纸的。只要是在印刷品上看到的图像,就是CMYK模式表现的。比如期刊、杂志、报纸、宣传画等,都是印刷出来的,那么就是CMYK模式的了。

CMYK原色与叠加之后的颜色对比

在不考虑透明度的情况下,一个像素点的颜色值在计算机中的表示方法有以下3种:

在Java中,float类型的变量占32位,int类型的变量占32位,short和char类型的变量都在16位,因此可以看出,用浮点数表示法编码一个像素的颜色,内存占用量是96位即12字节;而用24位整数表示法编码,只要一个int类型变量,占用4个字节(高8位空着,低24位用于表示颜色);用16位整数表示法编码,只要一个short类型变量,占2个字节;因此可以看出采用整数表示法编码颜色值,可以大大节省内存,当然,颜色质量也会相对低一些。在Android中获取Bitmap的时候一般也采用整型编码。

回想一下Android的BitmapConfig类中,有ARGB_8888、ARGB_4444、RGB565等常量,现在可以知道它们分别代表了什么含义。同时也可以计算一张在内存中可能占用的大小,比如采用ARGB_8888编码载入一张1920 1200的,大概就会占用1920 12004/1024/1024=879MB的内存。

采用低内存占用量的编码方式,比如BitmapConfigARGB_4444比BitmapConfigARGB_8888更省内存;

1920 1200的:

ARGB_8888:1920 1200 4/1024/1024=879MB

ARGB_4444,RGB565:1920 1200 2/1024/1024=439MB

在Android中,对的使用一定要关注,大多数情况下,占用内存多,OOM发生都是因为资源使用不当。不要盲目加一个大图到Android项目中,能使用9进来使用,而且9图本身尽可能小,另外能使用绘制实现就不要加一个资源。有些时候,在不影响用户体验的情况下,可以降低素材质量,比如不需要透明度的就不要了,有些透明度用肉眼看不出来。

很早就想整理一下自己平时常用的一些adb命令,不仅为了便于以后查找,而且整理的过程自己又重新复习了一遍,但是当我开始在度娘一搜的时候,发现很多人已经写的非常详细了,尤其是当我发现了这篇adb概括

心中一句NND,怎么可以写的这么详细,瞬间没了想写这篇文章的欲望,如果你点了链接发现确实很全,那么恭喜你可以关掉这篇了,哈哈哈。

我就不这么想的,虽然很全,但不是我常用的,因人而异,所以我就权当记笔记+替这哥们宣传了。

– adb devices , 获取设备列表及设备状态

设备的状态有 3 种

device , 设备连接正常

offline , 设备离线,连接出现异常

unauthorized 设备为进行授权,需要在设备上是否允许调试对话框进行授权

offline情况解决办法,先执行adb kill-server 命令,再执行adb start-server 命令,再尝试adb devices 查看列表,如果还是offline,来来来,使用必杀技,重启大法。

当电脑连接多个android设备并可用时,所有的adb命令都需要指定设备后执行(当然你也可以移除多余的设备)

adb -s <设备名称> install/uninstall/shell/pull/push等命令

– adb install app在pc硬盘路径,选中app直接拖入即可

常见的错误情况

INSTALL_FAILED_TEST_ONLY, 安装的app的debug版本的,未签名,adb install -t 路径即可安装

INSTALL_FAILED_DUPLICATE_PACKAGE, 已经安装相同包名的app, 先卸载再安装

– adb uninstall app的包名,卸载app

adb pull 将 Android 设备上的文件或者文件夹复制到本地

adb pull sdcard/Android/111txt E:\

小技巧,可以将本地路径指定为桌面,方便查看, 在桌面按住shift键,鼠标右键选择在此处打开命令行窗口,直接输入adb pull sdcard/Android/111txt 执行,就可将111txt复制到桌面。

前提是设备已经获取root权限

adb root

adb remount

adb push 将pc上文件复制到android设备中,修改room原生应用时比较频繁使用,如settingsapk, launcher3apk

– adb shell pm 命令

adb shell pm list package 列出android设备上的所有app

adb shell pm list package -s 列出android设备上的系统级别app

adb shell pm list package -3 列出android设备上的第三方app(用户安装的)

adb shell pm list package -f 列出app包名及对应的apk名及存放位置

adb shell pm list package -i 列出app包名及其安装来源(应用市场名称)

adb shell pm dump app包名 列出app的相关信息,类似获取Manifest文件内容

-查看前台 Activity

adb shell dumpsys activity activities “| grep mFocusedActivity”

-adb shell am 命令

最常用的就是启动指定的activity和发送指定的广播

启动指定的activity

*** 作指令 adb shell am start -n 包名/类名

注:如果启动activity时,出现如下错误

javalangSecurityException: Permission Denial: starting Intent { flg=0x10000000 > > cmp=commediatekengineermode/ioGpio } from null (pid=3083, uid=2000) not exported from uid 1001

解决办法,1、如果是你自己可控的app,那么找到你要调用的activity在manifestxml中,增加

1

配置即可, android:name="" 可以为空字符串。

2、如果是不可控的app,例如我调用的系统原生app,那么你就洗洗睡吧,别折腾了,除非你修改源码和上边一样 *** 作,重新push替换原来的app。

启动默认浏览器打开一个网页

adb shell am start -a androidintentactionVIEW -d 

先停止目标应用,再启动

adb shell am start -s comandroidcamera/Camera

启动相机

adb shell am start -n comandroidcamera/Camera

启动设置

adb shell am start -n comandroidsettings/comandroidsettingsSettings

启动Wifi设置

adb shell am start -n comandroidsettings/comandroidsettingswifiWifiSettings

启动蓝牙设置

adb shell am start -n comandroidsettings/comandroidsettingsbluetoothBluetoothSettings

其它的类似只要你能在manifest中找到配置的,都可以通过这种方法来调用

发送指定的广播

*** 作指令 adb shell am broadcast -a 广播名 --ei/es/ez 参数名 参数值 --ei/es/ez 参数名 参数值

–ei integer 值

–es String 值

–ez boolean 值

–ef float 值

–el long 值

例如之前写的

Android60 源码修改之Setting列表配置项动态添加和静态添加, 当中就通过发送广播来接收增加配置列表项

adb shell am broadcast -a cndynamicaddsettingcategoryitem --es location “0-2” --es title “红” --es intent “comandroidsettingsSCHEDULE_POWER_ON_OFF_SETTING”

-adb shell input keycode 指令

HOME 键 adb shell input keycode 3

返回键 adb shell input keycode 4

打开浏览器 adb shell input keycode 64

-adb shell wm 指令

屏幕分辨率 adb shell wm size

屏幕密度 adb shell wm density

adb shell wm density 320/480/640 可修改屏幕密度查看效果,对应Launcher图标会缩放

adb shell ifconfig 命令

IP 地址 adb shell ifconfig “| grep Mask”

WIFI 地址 adb shell ifconfig wlan0

状态栏和导航栏的显示隐藏

命令:

adb shell settings put global policy_control

可由如下几种键及其对应的值组成,格式为 key1=value1:key2=value2。

key        含义

immersivefull        同时隐藏

immersivestatus        隐藏状态栏

immersivenavigation        隐藏导航栏

immersivepreconfirms        同时显示

这些键对应的值可则如下值用逗号组合:

value        含义

apps        所有应用

所有界面

packagename        指定应用

packagename        排除指定应用

例如:

adb shell settings put global policy_control immersivefull=

表示设置在所有界面下都同时隐藏状态栏和导航栏。(重启也不会失效,恢复需调用下面的命令)

adb shell settings put global policy_control immersivepreconfirms=

表示恢复显示

adb shell settings put global policy_control immersivestatus=compackage1,compackage2:immersivenavigation=apps,-compackage3

表示设置在包名为 compackage1 和 compackage2 的应用里隐藏状态栏,在除了包名为 compackage3 的所有应用里隐藏导航栏

adb shell am force-stop app  关闭APP

adb shell pm clear APP  app进程被杀死,且会清楚所有数据

 1:查找手机安装应用的包名:adb shell pm list packages -f

    2:查看系统盘符:adb shell df

    3:查看Log 1:adb shell 2: logcat | grep "abc"

    4:删除应用:1:adbremount  2:adb shell  3:cdsystem/app   4:rm apk

    5:安装APK: adbinstall -r apk  或者 adb pushapk  /system/app

    6:查看APP启动的时间指令

     adb shell am start -W -ncomandroiddialer/DialtactsActivity  (W是大写)执行命令后APP会自 动启动,其中ThisTime即是本次     App启动所花费的时间。

    7:查看包名中当前所在进程信息:adb shell ps | grep +包名

    8:查看Activity运行的任务栈:adb shell dumpsys activity

     9:查看键值:adb logcat | grep intercep  -i

    10:查看模块所占有的CPU资源:adb shell top -d 2 -m 10

    11:查看可用系统的权

           $ adb shell

           # pm list permissions

   12:模拟按键的输入:adb shell input keyevent + 键值

      eg:  adb shell input keyevent  82   表示menu

             adb shell input keyevent  3     表示home

            adb shell input keyevent  19   表示up

             adb shell input keyevent  20   表示down

            adb shell input keyevent  21   表示left

             adb shell input keyevent  22   表示right

            adb shell input keyevent  66   表示enter

             adb shell input keyevent  4     表示back

    13:模拟滑动输入:adb shell input touchscreen <x1> <y1> <x2> <y2>

        eg: adb shell input touchscreen swipe 18 665 18 350

    14:启动一个Activity : adb shell am start -n 包名+类名

    15:录制屏幕:adb shell screenrecord /sdcard/demomp4

    16:重新启动:adb reboot   

    17:Monkey的基本用法下面是一个更为典型的命令行示例,它启动指定的应用程序,并向其发送500个伪随机事件:

          $ adb shell monkey -p yourpackagename -v 500

        如果跑桌面或者systemUi的monkey的话:

         adb shell monkey -v -v -p 桌面包名 --pct-touch 50 --pct-motion 30 --pct-syskeys 20 --throttle 300 -s 200 200000

    18:查找第三方应用的详细信息:

        adb shell dumpsys package +第三方包名(comtxznetwebchat)

Android中两种获取状态栏高度的方法

方法一:

private double getStatusBarHeight(Context context){

double statusBarHeight = Mathceil(25  contextgetResources()getDisplayMetrics()density);

return statusBarHeight;

}

这种方法很简单,只有一行代码:

状态栏高度=取大于其的最小整数(25上下文_获取应用包的资源实例_获取当前屏幕尺寸_屏幕密度比例)

其中density并不是真实的屏幕密度,而是一个相对密度,基准密度为160dpi,比如我测试的手机为HTC one m8,查的屏幕密度为441dpi,相对160为275,density就取为3。各分辨率的density取值为:

ldpi (dpi=120,density=075)

mdpi (dpi=160,density=1)

hdpi (dpi=240,density=15)

xhdpi (dpi=320,density=2)

xxhdpi (dpi=480,density=3)

所以得到的状态栏高度为253=75

由这种方法得到的状态栏高度具有较大局限性,比如因为某种需要去掉状态栏或本身没有状态栏,此时状态栏高度应为0,但是该方法依然能够得到一个非零的状态栏高度。

方法二:

private int getStatusBarHeight(Context context) {

int result = 0;

int resourceId = contextgetResources()getIdentifier("status_bar_height", "dimen", "android");

if (resourceId > 0) {

result = contextgetResources()getDimensionPixelSize(resourceId);

}

return result;

}

这里我们用到了getIdentifier()的方法来获取资源的ID,其中第一个参数是要获取资源对象的名称,比如我们要获取状态栏的相关内容,这里填入"status_bar_height";第二个参数是我们要获取什么属性,我们要获取高度内容,所以填入"dimen";第三个是包名,状态栏是系统内容,故填入“android”。

另外一个用到的办法是getDimensionPixelSize(),由函数名就能知道是根据资源ID获得资源像素尺寸,这里就直接获得状态栏的高度。

这种方法在状态栏不存在的时候就会获得其高度为0

以上就是关于android gallery中,怎么获取当前的图片并得到图片的高和宽的长度谢谢。全部的内容,包括:android gallery中,怎么获取当前的图片并得到图片的高和宽的长度谢谢。、怎样获取Android手机屏幕的大小、android density是什么意思等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/10063254.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-04
下一篇2023-05-04

发表评论

登录后才能评论

评论列表(0条)

    保存