Android怎么未找到无线网络适配器最优适配资源

最好用的三款直播软件你知道么?不看后悔!!!
电视盒子最重要的功能就是看海量视频,这时直播软件就成了非常重要的选择。那么好用的盒子直播软件有哪些?今天小编为大家推荐最佳应用TOP3。用网络机顶盒看电视的话,装什么直播软件比较好?对于初次接触盒子或者玩盒子时间并不久的消费者来说,这个问题的答案无从得知,因为现在市场上的直播软件数不胜,产品质量层次不齐,有些甚至携带病毒。为解决大家使用直播软件看电视节目的后顾之忧,今天,笔者就和大家分享三款现阶段非常流行,同时也是笔者自己目前在用直播软件,有兴趣的朋友,不妨下载一两款试试。
QQ截图27.jpg (216.94 KB, 下载次数: 0)
16:59 上传
HDP直播是一款针对电视、机顶盒精心设计的安卓应用。聚合了1000多个网络频道且保持每日更新。同时具有回看、节目预告、收藏功能,让你不错过任何最新节目。还具有节目分享,自制节目等功能!
QQ截图48.jpg (199.57 KB, 下载次数: 0)
16:59 上传
电视家是一款在Android大屏上看电视直播的应用,由一群喜欢看电视的群友共同打造的。电视家秉承千万人共同研发的理念,致力打造最好用的大屏直播应用,方便千万人,幸福电视人。
QQ截图54.jpg (219.63 KB, 下载次数: 2)
16:59 上传
蜜蜂视频是一款集高清免费直播、顶级最新片库(侏罗纪世界、末日崩塌、致命对决等等)为一体的电视、机顶盒必备软件,500+的直播节目、 10000+的点播节目和华丽的界面在汇聚类视频软件中一枝独秀。 1.00.56版本更新内容:1.新增更多直播源 2.解决部分机型适配问题 3.修改一些已知BUG。
以上软件都可以在进行下载哦,赶紧试试吧!
就用沙发管家!
沙发网为你推荐以下精彩应用
下载:58288次
下载:1000万+次
下载:1000万+次
下载:23905次
下载:41万+次
下载:31万+次
下载:2164次
下载:239万+次
楼主简直是神贴,看到真是太高兴了!
就用沙发管家!
<a onclick="ga('send', 'event', 'BBS', 'banner002')"
稳定收看凤凰卫视免费直播的方法分小米盒子内存不足怎么办?神技!
<a onclick="ga('send', 'event', 'BBS', 'banner002')"
沙发客服在线
周一至周日9:30-23:00 客服在线
Copyright &
版权所有 All Rights Reserved.
Powered by当我们将一些提供了不同的资源文件可供系统选择的时候,会在运行时会根据一套适配的规则选择最符合当前配置的资源。为了说明怎么选择资源,假设我们有以下可选的资源文件目录,每一个目录都包含同一张图片的不同版本。
drawable-en/
drawable-fr-rCA/
drawable-en-port/
drawable-en-notouch-12key/
drawable-port-ldpi/
drawable-port-notouch-12key/
&假设系统配置是下面这样的:
Locale =&en-GB&Screen orientation =&port&Screen pixel density =&hdpi&Touchscreen type =&notouch&Primary text input method =&12key
在将系统配置与可选的资源对比之后,选择
Android根据下面的逻辑去选择资源
1、排除跟系统配置不同的资源文件
drawable-fr-rCA/被排除了,因为它违背了。&
drawable-en/
drawable-fr-rCA/
drawable-en-port/
drawable-en-notouch-12key/
drawable-port-ldpi/
drawable-port-notouch-12key/
&例外:屏幕像素密度(Screen pixel density) 这种限定词不会简单地因为跟当前系统配置不同而被排除。即使当前屏幕的配置是,不会被排除,因为每种屏幕密度都被认为可适配的。更多相关的信息查看
2、选出(下一个)最高优先级限定词(开始于,然后越往下越低)。
3、是否还有包含这个限定词的资源目录?
●否,返回步骤然后查找下一个限定词(在例子中,答案是否,直到语言限定词被找到)。
●是,继续第步。
4、排除没有包含这个限定词的资源文件目录。在这个例子中,系统排除了所有没有包含语言限定词的目录:
drawable-en/
drawable-en-port/
drawable-en-notouch-12key/
drawable-port-ldpi/
drawable-port-notouch-12key/
& &例外:如果限定词是屏幕像素密度(device screen density),Android会选择最接近屏幕像素密度的一个。 总之,Android比较偏向于将原始的大图片缩放成 小的图片。 参考&.
5、返回重复步骤,,和知道只剩下一个目录。在这个例子中,屏幕方向是下一个用来匹配资源的限定词。所以,没有限定屏幕方向的资源文件目录就被排除了。
drawable-en/
drawable-en-port/
drawable-en-notouch-12key/
最后剩下的目录是
虽然在请求每一个资源文件的时候都会执行上述的处理过程,但是系统自己会进行查找过程的优化。其中一个优化就是一旦系统的配置已经被加载,它可能会排除掉永远不会匹配的可选资源。比如,如果配置中的语言为英语&,那么任何其他有语言限定词又不是英语的就会从可选的资源目录池当中排除(但是如果资源目录中没有语言限定词,那么它依然是可选的)。
当根据屏幕大小选择资源的时候,如果找不到能跟当前屏幕匹配的资源,为比当前更小的屏幕设计的资源就会被使用(比如,一个屏幕将会在必要的时候使用屏幕的资源文件)。然而,如果唯一可选的资源比当前的屏幕大,系统不会使用它们并且你的程序会崩溃如果没有其他的资源能够跟系统配置匹配(比如,所有的资源都有的限定,但是当前的设备屏幕是的)。
注意:在准确匹配资源上,限定词的优先级(在)比限定词的数量更重要。例如,在上面的步骤,列表中的最后一项还包含了三种能够准确匹配系统配置的资源(、和),然而那项只有一项匹配语言。然而,语言有比其他限定词更高的优先级,所以就被排除了。
本文翻译自
阅读(...) 评论()(点击上方公众号,可快速关注)来源:lizhangqu链接:http://blog.csdn.net/sbsujjbcy/article/details/参考该文章理论知识加代码Android 屏幕适配方案但是呢,该篇博文里个人觉得代码封装的不是很好,于是自己封装了下,使用XStream生成xml。上面那篇文章里没有对横竖屏进行适配,代码里完善了这一点,对横竖屏进行了适配。在开始码代码前,贴一张图,结合前面那篇文章的理论知识一起看。然后呢看最终适配的效果,这里以320*480为基准,屏幕上放一个TextView,宽度为x160,高度为y240,效果图如下然后呢,不要惊讶,你会发现里面的两个pad并没有适配,其实呢,我也母鸡呀,但是我开了一个模拟器,启动了一个pad,其实是适配了。于是就没有然后了,有兴趣的再研究下吧。先封装Screen类package cn.edu.zafu./** * @author lizhangqu * @description * @date */public class Screen {
public Screen(int width, int height) {
this.width =
this.height =
public int getWidth() {
public void setWidth(int width) {
this.width =
public int getHeight() {
public void setHeight(int height) {
this.height =
public String getDir(boolean portrait) {
// landscape是横向,portrait是纵向
if (portrait) {
return String.format(&values-%dx%d&, height, width);
return String.format(&values-land-%dx%d&, height, width);
public String toString() {
return &Screen [width=& + width + &, height=& + height + &]&;
}}其次是Rescource类,使用注解package cn.edu.zafu.import java.util.ArrayLimport java.util.Limport com.thoughtworks.xstream.annotations.XStreamAimport com.thoughtworks.xstream.annotations.XStreamI/** * @author lizhangqu * @description
*/@XStreamAlias(&resources&)public class Resource {
@XStreamImplicit(itemFieldName = &dimen&)
List&Dimen& dimens = new ArrayList&Dimen&();
public Resource() {
public Resource(List&Dimen& dimens) {
this.dimens =
public List&Dimen& getDimens() {
public void setDimens(List&Dimen& dimens) {
this.dimens =
public String toString() {
return &Resource [dimens=& + dimens + &]&;
}}Dimen类,依然使用注解package cn.edu.zafu.import com.thoughtworks.xstream.annotations.XStreamAimport com.thoughtworks.xstream.annotations.XStreamAsAimport com.thoughtworks.xstream.annotations.XStreamCimport com.thoughtworks.xstream.converters.extended.ToAttributedValueC/** * @author lizhangqu * @description
*/@XStreamAlias(&dimen&)@XStreamConverter(value = ToAttributedValueConverter.class, strings = { &value& })public class Dimen {
@XStreamAlias(&name&)
@XStreamAsAttribute()
public Dimen() {
public Dimen(String name, String value) {
this.name =
this.value =
public String getName() {
public void setName(String name) {
this.name =
public String getValue() {
public void setValue(String value) {
this.value =
public String toString() {
return &Dimen [name=& + name + &, value=& + value + &]&;
}}继承XStream类,默认的只会输出xml体,我们加入xml头&?xml version=&1.0& encoding=&utf-8&?&package cn.edu.zafu.import java.io.OutputSimport java.io.Wimport com.thoughtworks.xstream.XS/** * @author lizhangqu * @description
*/public class XmlDeclarationXStream extends XStream {
private String xmlD
public XmlDeclarationXStream() {
this(&1.0&, &utf-8&);
public XmlDeclarationXStream(String version, String ecoding) {
this.version =
this.ecoding =
buildDeclaration();
private void buildDeclaration() {
// generate xmlDeclaration
StringBuffer buffer = new StringBuffer();
xmlDeclaration = buffer.append(&&?xml version=\&&).append(this.version)
.append(&\& encoding=\&&).append(this.ecoding).append(&\&?&&)
.append(&\n&).toString();
public String getDeclaration() {
return xmlD
public void toXML(Object arg0, OutputStream arg1) {
String dec = this.getDeclaration();
byte[] bytesOfDec = dec.getBytes(this.ecoding);
arg1.write(bytesOfDec);
} catch (Exception e) {
e.printStackTrace();
super.toXML(arg0, arg1);
public void toXML(Object arg0, Writer arg1) {
arg1.write(getDeclaration());
} catch (Exception e) {
e.printStackTrace();
super.toXML(arg0, arg1);
}}最后是生成资源文件的工具类,见注释package cn.edu.zafu.import java.io.BufferedWimport java.io.Fimport java.io.FileOutputSimport java.io.IOEimport java.io.OutputStreamWimport java.text.DecimalFimport java.util.Limport cn.edu.zafu.model.Dimport cn.edu.zafu.model.Rimport cn.edu.zafu.model.Simport com.thoughtworks.xstream.XS/** *
* @author lizhangqu * @description a tool to generate what we want * @date */public class Generator {
// default base width
private static final int DEFAULT_BASE_WIDTH = 320;
// default base height
private static final int DEFAULT_BASE_HEIGHT = 480;
// decimal formator
private static final DecimalFormat DECIMAL_FORMAT = new DecimalFormat(
// a xstream,XmlDeclarationXStream extends XStream
private static final XStream XSTREAM = new XmlDeclarationXStream();
private File resFile=
// base width
private int baseW
// base height
private int beseH
* using default width and height to generate default width is 320,default
* height is 480
public Generator() {
this(DEFAULT_BASE_WIDTH, DEFAULT_BASE_HEIGHT);
* using baseWidth and baseHeight to generator
* @param baseWidth
* @param beseHeight
public Generator(int baseWidth, int beseHeight) {
this.baseWidth = baseW
this.beseHeight = beseH
XSTREAM.autodetectAnnotations(true);
this.resFile = new File(&./res&);
if (!resFile.exists()) {
resFile.mkdir();
* using w and h to generate xml
* @param w
screen width
* @param h
screen height
* @return generated xml
public String generateXml(Screen screen) {
Resource resource = new Resource();
List&Dimen& dimens = resource.getDimens();
float cellWidth = screen.getWidth() * 1.0f / baseW
float cellHeight = screen.getHeight() * 1.0f / beseH
String result =
Dimen dimen =
for (int i = 1; i &= baseW i++) {
result = DECIMAL_FORMAT.format(i * cellWidth);
dimen = new Dimen();
dimen.setName(String.format(&x%d&, i));
dimen.setValue(String.format(&%spx&, result));
dimens.add(dimen);
for (int i = 1; i &= beseH i++) {
result = DECIMAL_FORMAT.format(i * cellHeight);
dimen = new Dimen();
dimen.setName(String.format(&y%d&, i));
dimen.setValue(String.format(&%spx&, result));
dimens.add(dimen);
String xml = XSTREAM.toXML(resource);
public String generateXmlLandscape(Screen screen) {
Screen s=new Screen(screen.getHeight(),screen.getWidth());
return generateXml(s);
* write xmlContent to a File
* @param screen
* @param xmlContent
public void write2File(String valuesPath, String xmlContent) {
File fileDir = new File(this.resFile + File.separator + valuesPath);
fileDir.mkdir();
File file = new File(fileDir.getAbsolutePath(), &dimens.xml&);
BufferedWriter bw =
FileOutputStream fos =
fos = new FileOutputStream(file);
bw = new BufferedWriter(new OutputStreamWriter(fos));
bw.write(xmlContent);
} catch (IOException e) {
e.printStackTrace();
if (bw != null) {
bw.close();
if (fos != null) {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}}主函数,生成常见分辨率的资源文件package cn.edu.import java.util.ArrayLimport java.util.Limport cn.edu.zafu.model.Simport cn.edu.zafu.util.G/** * @author lizhangqu * @description * @date */public class Main {
public static void main(String[] args) {
new Main().bulid();
public void bulid() {
Generator generator = new Generator(320, 480);
List&Screen& screens = new ArrayList&Screen&();
Screen screen =
screen = new Screen(320, 400);
screens.add(screen);
screen = new Screen(320, 480);
screens.add(screen);
screen = new Screen(480, 800);
screens.add(screen);
screen = new Screen(480, 854);
screens.add(screen);
screen = new Screen(540, 960);
screens.add(screen);
screen = new Screen(600, 1024);
screens.add(screen);
screen = new Screen(720, 1184);
screens.add(screen);
screen = new Screen(720, 1196);
screens.add(screen);
screen = new Screen(720, 1280);
screens.add(screen);
screen = new Screen(768, 1024);
screens.add(screen);
screen = new Screen(768, 1280);
screens.add(screen);
screen = new Screen(800, 1280);
screens.add(screen);
screen = new Screen();
screens.add(screen);
screen = new Screen();
screens.add(screen);
screen = new Screen();
screens.add(screen);
screen = new Screen();
screens.add(screen);
screen = new Screen();
screens.add(screen);
screen = new Screen();
screens.add(screen);
int size = screens.size();
for (int i = 0; i & i++) {
String portrait = generator.generateXml(screens.get(i));
generator.write2File(screens.get(i).getDir(true), portrait);
String landscape = generator.generateXmlLandscape(screens.get(i));
generator.write2File(screens.get(i).getDir(false), landscape);
System.out.println(&create file &+i+& success&);
System.out.println(&success&);
}}源码下载github下载:AndroidScreenAdaptercsdn下载:AndroidScreenAdapter安卓应用频道微信号:AndroidPD打造东半球最好的 安卓技术 微信号--------------------------------------商务合作QQ:投稿网址:安卓应用频道(androidpd) 
 文章为作者独立观点,不代表微头条立场
的最新文章
结合前几篇文章,Canvas的基本操作已经差不多完结了,然而Canvas不仅仅具有这些基本的操作,还可以更加炫酷,本次会了解到path(路径)这个Canvas中的神器,有了这个神器,就能创造出更多炫(zhuang)酷(B)的东东了。本篇文章将介绍一些绘制图片文字相关的内容。如果你对前几篇文章讲述的内容熟练掌握的话,那么恭喜你,本篇结束之后,大部分的自定义View已经难不倒你了,当然了,这并不是终点,接下来还会有更加炫酷的技能。本章节为什么要叫进阶篇?(虽然讲的是基础内容),因为从本篇开始,将会逐渐揭开自定义View的神秘面纱,每一篇都将比上一篇内容更加深入,利用所学的知识能够制作更加炫酷自定义ViewLinus有一句名言广为人知:Read the fucking source code.其实,要深入理解某个软件、框架或者系统的工作原理,仅仅「看」代码是远远不够的。拿Android Framework来说,那些个动辄几万行的类如何去理解?这里利用一个简单的应用对MVP做一个讲解。后面也有很多github源码,都是特别经典的例子,可以学习一下。谷歌和甲骨文之间长达六年的 Java 版权案,今天终于尘埃落定。当地时间周四,联邦陪审团在经过 3 天的商议后,最终裁定谷歌 Android 操作系统并未侵犯甲骨文的版权,那 37 个 Java API 是合理使用(fair use)。这篇文章介绍了mock的概念以及Mockito的使用,可能Mockito的很多的一些其他方法没有介绍,但这只是阅读文档的问题而已,更重要的是理解mock的概念。 如果你想了解Mockito更详细的用法可以参考这篇文章,写的是相当的好。本篇主要介绍一些Fragment使用技巧。做移动开发总是离不开在移动设备上做测试,虽然说Android设备单机可能比iPhone便宜,但是真要各种设备集齐也是不小的开支,再加上要试验不同的Android版本那组合起来又有好多了。看到很多人提问非科班该如何学习编程,其实科班也基本靠自学。有句话叫“师傅领进门修行靠个人”,再厉害的老师能教你的东西都是很有限的,真正的修行还是要靠自己。线程是程序员进阶的一道重要门槛。对于移动开发者来说,“将耗时的任务放到子线程去执行,以保证UI线程的流畅性”是线程编程的第一金科玉律,但这条铁则往往也是UI线程不怎么流畅的主因。Android的体系架构鼓励组件重用,今天我将分享一些关于Android架构和开发库信息,供开发者创建下一个杀手级应用使用。准备好了吗?请继续下面的阅读!自己android开发也有些年头了,每每回想起作为初学者的时候自己写的代码,自己会有种喷自己的冲动,代码写的太渣了。因此想着自己要总结下以前代码中的不合理的地方,希望能给初学者一些帮助。我希望这是一个系列的文章。React Native允许我们运用React和 Relay提供的声明式的编程模型,写JavaScript来构建我们的 iOS 和 Android 的应用。这样的做法使得我们的代码更精简,更容易理解和阅读,这些代码还可以在多个平台共享。最近一直在想着能否有一种更好的方案解决:Android中Activity与Fragment之间通信的问题,能让Fragment的复用性高,性能还有好(不用反射),代码好维护,不需要为每对Activity和Fragment之间定义接口而发愁。7.自定义view中 如果onMeasure方法 没有对wrap_content 做处理 会发生什么?为什么Android View绘制13问13答本文主要是根据核心思想的实践,实践原理是通过CustomRootLayout布局变化,来获知是否是键盘引起的真正的布局变化,进而处理到接下来PanelLayout的onMersure中。下面我们就来逐一实现这些目标。首先要对MyFragment类进行完全保留可以使用keep关键字,keep后声在上一篇文章当中,我们学习了Android程序反编译方面的知识,包括反编译代码、反编译资源、以及重新打包等内容。通过这些内容我们也能看出来,其实我们的程序并没有那么的安全。之前一直有犹豫过要不要写这篇文章,毕竟去反编译人家的程序并不是什么值得骄傲的事情。不过单纯从技术角度上来讲,掌握反编译功能确实是一项非常有用的技能,可能平常不太会用得到,但是一旦真的需要用到的了,而你却不会的话,那就非常头疼了。此文面向开发者,开发主管,总监,CEO等。IssueRegistry提供需要被检测的Issue列表public class MTIssueRegistAndroid Lint是Google提供给Android开发者的静态代码检查工具。使用Lint对Android工程代码进行扫描和检查,可以发现代码潜在的问题,提醒程序员及早修正。做Android久了,就会踩很多坑,被坑的多了就有经验了,闲暇之余整理了部分,现挑选一些重要或者偏门的“小”经验做个记录。三层架构中,数据层和业务层都已经做过了简单的分享,最后,就剩下展示层了。本篇就给各位分享下我在展示层设计方面的一些经验心得。业务层其实并不复杂,但是大部分开发人员对其职责并没有理解清楚,从而使其沦落为一个数据中转站。我之前分享过的Android项目重构之路系列中提到的核心层,其实就是这里所讲的业务层。一个App,从根本上来说,就是对数据的处理,包括数据从哪里来、数据如何组织、数据怎么展示,从职责上划分就是:数据管理、数据加工、数据展示。相对应的也就有了三层架构:数据层、业务层、展示层。本文就先讲讲数据层的设计。当你做架构设计时,必然会面临技术选型的抉择,不同的技术方案,架构也可能完全不同。有哪些技术选型需要做决策呢?比如,App是纯原生开发,还是Web App,抑或Hybrid App?本文根据我的一些经验对某些方面做点总结分享。过去一年多,我仗着自己年轻的身体,对计算机的热情,在工作上多使用蛮力,仿佛一个使用朴素算法实现的程序,吭哧吭哧跑个不停。一开始,朴素算法还能在指定的工作时间内完成任务;老外的书,讲了很详细,第一遍阅读的时候感觉有些吃力。做了一些项目回头看,确实收获很大。欢迎阅读《安卓开发的小技巧》系列的第三篇!界面是 Android 应用中直接影响用户体验最关键的部分。如果代码实现得不好,界面容易发生卡顿且导致应用占用大量内存。(点击上方公众号,可快速关注)来源:solidot链接:http://www.solidot.org/sto(点击上方公众号,可快速关注)来源:How my sister n my girlfriend learne(点击上方公众号,可快速关注)来源:Charlie译文:伯乐在线 - Jyy链接:http://androi(点击上方公众号,可快速关注)来源:Keegan小钢链接:http://keeganlee.me/post/最近在项目中需要使用一种高效数据序列化的工具。碰巧在几篇文章中都提到了 FlatBuffers 这个库。特别是 Android 性能优化典范第四季1中两个对比图,让我对它产生浓厚的兴趣。有思路我们在回顾下ConfirmDialogFragment中onAttach的方法的关键代码:
@Ov内存泄露是在Android开发中尤其要重视的一个问题,对开发人员开说,这是一个很容易犯也很常见的错误。曾经我也是一个原教旨主义者,认为除了基于原生Android外的安卓机都是异端。这些年里,写过Android App代码也做过Android App的产品经理,历尽洗礼,终于恢复了理智的光环,要重新思考一下什么才是真正的Android。Material Design 是Google在2014年开发者大会上首次提出的设计语言(风格)。其设计初衷旨在为手机、平板、台式机和可能的“其他平台”提供一致、广泛的视觉与交互。Android 事件分发机制源码和实例解析在项目开发中,我们或多或少都会用到数据库。在Android中,我们一般使用SQLite,因为Android在android.database.sqlite包封装了很多SQLite操作的API。Android系统是运行在Java虚拟机上的,作为嵌入式设备,内存往往非常有限,了解Android的垃圾回收机制,可以有效的防止内存泄露问题或者OOM问题。本文作为入门文章,将浅显的讨论垃圾回收与内存泄露的原理。从事互联网有几年时间,接触到的技术人员大多有以下问题:
① 木讷、没礼貌;
② 合作做事情不喜欢汇报进度;
③ 不回QQ,回的话就重现第1点以下内容来自多个开源项目的整理和自己的项目积累……上一篇文章我们使用第三种方法来实现延迟加载。不过上一篇写的比较简单,只是讲解了如何去实现,这一篇就来讲一下为何要这么做,以及这么做后面的原理。其中会涉及到一些 Android 中的比较重要的类。在 Android 开发中。应用启动速度是一个非常重要的点,应用启动优化也是一个非常重要的过程。对于应用启动优化。其实核心思想就是在启动过程中少做事情。具体实践的时候怎么弄,无非就下面几种。由前Google工程师创办的Jide Technology发布了alpha版的 Remix OS 2.0 。androidpd分享安卓应用相关内容,包括:安卓应用开发、设计和推广。热门文章最新文章androidpd分享安卓应用相关内容,包括:安卓应用开发、设计和推广。前端之Android入门(6):屏幕适配 - 腾讯ISUX &#8211; 社交用户体验设计
在前几篇文章,我们大致了解了Android开发的一些常规模式和方法,在这个过程中其实我们已经接触到了屏幕适配方面的相关知识,但是并没有深入地讲解这些概念。这篇文章我们将分三个方面进行详细讲解。
一,Android的度量单位
在Android中,定义组件尺寸的单位通常有dp和sp,那么它们跟我们经常使用的px有什么区别呢?
px是Pixels的缩写,是常用的像素单位,对应的是屏幕上的点。
移动设备的尺寸有很多种,它们的屏幕总像素也是不同的,使用px单位的组件尺寸会有不一致的情况。
我们看个例子
可以看出这个加号icon在分辨率较高,尺寸较大的屏幕上反而显得略小
dp(density-independent pixel)是与密度无关的像素单位,也就是dip。它是基于设备屏幕物理密度的抽象单位。1dp 表示屏幕DPI为160时1px的长度。DPI 越高的屏幕,屏幕绘制1dp 需要越多的像素,反之亦然。
我们可以将上个例子的图片宽高设置为30dp
可以看出两个加号icon的尺寸是一致的
sp(scale-independent pixel)是与缩放无关的像素单位。跟dp类似,唯一的不同是,该单位会受系统字体设置的影响,通常用在字体上。
Android在设计规范中规定了字体的常用大小:
使用dp/sp的好处是,无论屏幕DPI如何,组件总能表现一致。
二,Android的布局
在Android开发,为程序定义用户界面布局有以下方法:
在XML 文件定义
在程序代码中实例化布局
使用图形布局工具
以上三种方法各有利弊,我们会根据需求场景来应用不同的布局方式,这里主要讲XML布局。
在XML文件定义组件,可以方便的管理程序的UI部分,并且分离表现和行为,使得代码容易管理阅读和管理,而且可以为不同的屏幕定制XML文件。
常用的布局有Frame Layout , Linear Layout , Relative Layout , List View 和 Grid View。
由于List View 和 Grid View 涉及数据部分,我们放到后面再讲,先从几个简单的开始
Frame Layout
FrameLayout是最简单的布局,添加到这个布局的元素都是层叠的,当前元素会被下一个元素覆盖,相当于CSS中的绝对定位position:absolute。
从 Summary 的 XML Attributes 中可以知道这些属性的信息概要。
几个常用的属性:
android:foreground
设置布局的前景图,前景图不会被子元素覆盖
android:foregroundGravity 设置布局前景图的位置
对于,这里仅有android:layout_gravity属性,可以查看前面文章
我们可以实践一下:
新建一个Android项目,然后在layout文件夹找到布局xml文件并写入以下布局
运行效果如下:
更多详细信息可以查看谷歌大神文档:
Linear Layout
线性布局在前面有所讲解,小伙伴们可以看这篇文章
Relative Layout
相对布局可以指定元素的位置。元素的位置可定义为相邻元素的相对位置(例如元素A在元素B的左侧),也可以定义为父元素的相对位置(例如在父元素的中间或者左侧)。
使用相对布局可以方便的控制元素的位置。在没有定义时,所有的元素都是在父元素的左上方。
从 Summary 的 XML Attributes 中可以知道这些属性的信息概要。
几个常用的属性:
android:gravity 设置其内容(文字、视图)在该元素内的位置
android:ignoreGravity
设置元素的ID使其不受gravity属性的影响
在 ,有两类属性,一类是子元素在父元素的对齐方式,另一类是子元素相对其他元素的位置
下面是第一类属性的示意图
对于第二类属性,我们实践一下:
新建一个Android项目,然后在layout文件夹找到布局xml文件并写入以下布局
然后在values文件夹找到string.xml并增加以下代码
运行效果如下:
更多详细信息可以查看谷歌大神文档:
三,Android的屏幕适配
1.屏幕相关概念
下面介绍几个常见的名词
通过查阅设备信息可以知道设备的物理尺寸,也可以通过计算屏幕对角线的长度得到。
在Android的设计规范中,把屏幕分成了4类:Small,Normal,Large,Extra Large
屏幕在物理尺寸范围内的像素数量。也通常指DPI(dots per inch)。屏幕密度越小,所包含的像素也就越少。
在Android的设计规范中,把屏幕密度划分为4类:Low,Medium,High,Extra High。
屏幕方向有横向和纵向,这两种情况下的屏幕长宽比是不同的。
跟电脑分辨率的概念类似,表示屏幕横纵方向的像素数,例如480*800。
在为APP进行屏幕适配时,不能只考虑到像素,还有屏幕大小,屏幕密度等等。
dots per inch,就是每英寸多少像素,通过下面公式可以得到。
DPI=(√(横向分辨率^2+纵向分辨率^2))/屏幕尺寸
在Android的设计规范中,DPI分成了5个档次:MDPI,HDPI,XHDPI,XXHDPI,XXXHDPI,它们的比例是 2:3:4:6:8
可以看一下不同的尺寸单位在不同屏幕的情况:
XHDPI屏幕(~320DPI)
HDPI屏幕(~240DPI)
MDPI屏幕(~160DPI)
通过以上可以得出:
在MDPI的屏幕(即160DPI),1dp 和1sp 基本等于 1px 。
dp 和 px的换算公式:px = dp*(DPI/160)。
sp 和 px的换算公式:px = sp*(DPI/160)。
2.为不同的屏幕大小提供布局
通常来说,Android通过缩放使得APP可以适应屏幕大小,但是对于一些特殊情况,我们可以提供更佳的布局使得体验更好。例如,在大屏幕设备,可以通过调整UI组件的位置和大小使屏幕的空间可以得到充分利用。对于小设备,就只需要调整UI组件的大小就行。
布局常用的大小有small,normal,large和x-large,可以根据需要选择布局的类型进行配置。
常用的布局配置如下:
res/layout/layout.xml
res/layout-small/layout.xml
res/layout-large/layout.xml
res/layout-large-land/layout.xml
3.为不同的屏幕密度提供图片
对于android来说,可以使用的图片类型有.png,.jpg,.gif以及.9.png(点九图)。APP会为不同的屏幕放大或者缩小图片。如果只为MDPI的设备提供了图片,那么对于HDPI的设备图片会放大,对于LDPI的设备图片会缩小。所以最好的方式是为不同的屏幕密度提供图片。
对于设计师来说,可以选择320DPI作为标准对APP进行设计,然后选择Photoshop/Illustrator这些工具,按照设备的比例,导出不同尺寸的图片。例如,为标准尺寸设备(XHDPI)设计的200&#215;200按钮图,就需要为HDPI设备导出150&#215;150的尺寸,为MDPI设备导出100&#215;100的尺寸
然后将这些图片放到 res/ 中对应的文件夹,APP会根据设备的情况选取图片。
设置如下:
res/drawable-xhdpi/image.png
res/drawable-hdpi/image.png
res/drawable-mdpi/image.png
“点九”是一种特殊的PNG格式,可以对图片指定拉伸区域和内容区域。在SDK里面的 tools/文件夹就能找到制作这种图片的工具。
工具界面如下:
把图片拖拽到工具里面进行加点标记
在图片的左边(A区域左侧)和上边(B区域上方)进行标记,表示该区域可伸缩。
在图片的底边(c区域下方)和右边(D区域右侧)进行标记,表示该区域是内容。
标记完之后,文件在保存的时候会将改为.9.png格式。
使用时,在xml文件中设置android:background=”@drawable/button”。
关于点九的文章前面有同学介绍过:
当然,如果你想偷懒的话,这里有个工具可以帮你点:)
在做屏幕适配时,需要注意以下几个点:
在定义xml布局的时候,使用dp单位,wrap_content,fill_parent(match_parent)
为不同的屏幕密度提供不同的图片
对于有某些规则(渐变)的图片使用点九图
为特殊的屏幕类型(横竖屏)提供不同的布局
对于本节来说,是非常基础的知识,同时,这也是打造精品APP的必备知识,各位加油吧:P
留下你的想法吧
友情链接:
Copyright &
All Rights Reserved}

我要回帖

更多关于 未找到无线网络适配器 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信