‘壹’ android适配问题
开发安卓app考虑机型适配,主要从以下三个方面考虑适配:
1.操作系统适配,即适配Android 2.X,4.X,5.X……每个版本的操作系统,都有其特定的变化,对于App开发者而言,最重要的一点就是要明确每一个版本API Changed List。
2.厂家型号,即适配三星、小米、Note5、米2……这块有两种适配方式,一是公版适配,二是定制开发。我们先从公版适配说起,这也是大多数App在用的方式。
公版适配这里指的是只存在一套代码,一个APK,要适配所有的厂商或机型。比较差的方式通常就是在代码中涉及到不同厂商或型号的地方通过if语句利用Build里的厂商标识等进行不同的策略,其结果就是适配得越多,if语句越复杂,越难维护。其实只要利用一个工厂模式就可以做得更灵活一些,
3.硬件兼容。主要是对包括屏幕分、CPU、内存、外存、传感器等进行适配,其主要思路也是抽象隔离。 在数据层,最主要的是进行外部存储的适配,即考虑数据存储的位置、格式、易失性等。通常这种持久化的数据存储,都要考虑存储位置及其易失性问题,不要把关键数据保存在易失的外部存储当中,还有Android 5.X开始的外卡的不可访问性,进而,可以根据存储空间和数据特点考虑明文格式还是密文格式,压缩还是不压缩。
由于android手机的碎片化,没有像ios那样只有固定的机型和尺寸,所以要做到全部适配是不可能,合适的做法是适配市场上流行的机型尺寸、厂商和硬件设备。
‘贰’ 如何解决android设备的适配问题
一、一些基本概念
1、长度(真实长度):英寸、inch
2、分辨率:density 每英寸像素数 dpi(密度)
3、像素:px
4、dip的公式:px /dip=dpi/160 所以 dip 类似于英寸、长度(dp=dip,sp类似于dip) dip=160*inch
dip= 160/dpi * px
当dip一定时,dpi 越大,px就越大
5、广义分辨率=长px*宽px
二、常用规律
1、平时我们说 手机的分辨率是 320*480的,其实的这里的分辨率是相对分辨率
意思是:水平方向上的像素数是320,垂直方向上像素数是480,
分辨率是160(默认是160,意思是每英寸像素数160)
那么水平方向:320 /160=2英寸
垂直方向:480/160=3英寸
于是乎 屏幕对角线 是根号下4*9=3.6(这就是常说的3.6英寸屏幕)
2、说一个手机的屏幕参数有三个:长宽像素之积(相对分辨率)、真实分辨率(dpi)、对角线长度
3、模拟器的分辨率都是160,所以像素越大,屏越大
4、l、m、h 三个文件夹是按 真是分辨率dpi 来对应找文件的。
5、有三种方案解决屏幕适配
(1)按像素比 y/开发时用的屏幕像素=x/用户设备像素
(2)按长度 用dip(假设屏幕尺寸基本不变)
(3)按密度 放在l、m、h文件夹(假设屏幕尺寸基本不变,dpi越大 px越大)
6、如果手机是hdpi,但hdpi里没有东西,l里有东西,程序就会去l里找图片并且把它按比例放大。
7、最全的办法:单独适配
屏幕分辨率:1024x600
density:1(160)
文件夹:values-mdpi-1024x600
屏幕分辨率:1024x600
density:1.5(240)
文件夹:values-hdpi-683x400 由1024/1.5 600/1.5得到,需要四舍五入。
屏幕分辨率:800x480
density:1(160)
文件夹:values-mdpi-800x480
屏幕分辨率:800x480
density:1.5(240)
文件夹:values-hdpi-533x320 由800/1.5 480/1.5得到,需要四舍五入。
以此类推
一般情况下需要创建出values 、values-mdpi 、 values-hdpi文件夹,以备在一些没有规定的尺寸屏幕上找不到资源的情况。
‘叁’ android中Adapter有什么作用常见的Adapter有哪些
Adapter即适配器,适配器的作用是允许硬件或电子接口与其它硬件或电子接口相连,也可以是信息接口。
常见的Adapter如:电源适配器、三角架基座转接部件、USB与串口的转接设备等。
适配器模式主要应用于,当接口里定义的方法无法满足客户的需求,或者说接口里定义的方法的名称或者方法界面与客户需求有冲突的情况。
(3)android适配方法扩展阅读
Adapter主要在View上显示,可以看作是界面数据绑定的一种理解。它所操纵的数据一般都是一些比较复杂的数据,如数组,链表,数据库,集合等。适配器就像显示器,把复杂的东西按人可以接受的方式来展现。
ArrayAdapter,SimpleAdapter,SimpleCursorAdapter这三个都是继承BaseAdapter,BaseAdapter是一个抽象类,需要子类继承并实现其中的方法才能使用,常用于用户自定义适配器时,显示比较复杂的数据。
‘肆’ Android一般开发的时候的屏幕适配是怎么做的
Android中一个layout想适配各种屏幕尺寸那么需要按以下规则去写layout:
1. 尽量使用wrap_content、match_parent、weight 来规定layout的大小。
2. 要确保布局的灵活性并适应各种尺寸的屏幕,应使用 “wrap_content” 和 “match_parent” 控制某些视图组件的宽度和高度。
3. 使用 “wrap_content”,系统就会将视图的宽度或高度设置成所需的最小尺寸以适应视图中的内容,而 “match_parent”(在低于 API 级别 8 的级别中称为“fill_parent”)则会展开组件以匹配其父视图的尺寸。
4. 如果使用 “wrap_content” 和 “match_parent” 尺寸值而不是硬编码的尺寸,视图就会相应地仅使用自身所需的空间或展开以填满可用空间。此方法可让布局正确适应各种屏幕尺寸和屏幕方向。
5. 如果某些地方必须要规定控件的大小,那么要使用dp 或者 dip单位。
6. 字段必须使用 sp单位。
7. 将不同的图片放到不同的drawable目录下,分辨率的匹配规则如下:
drawable-mdpi 320 * 480
drawable-hdpi 480*800
drawable-xhdpi 720 * 1280
drawable-xxhdpi 1080 * 1920
drawable-xxxhdpi 1080+
‘伍’ AndroidUI的适配有哪些
字体使用sp,使用dp,多使用match_parent,wrap_content,weight
图片资源,不同图片的的分辨率,放在相应的文件夹下可使用百分比代替。
‘陆’ 如何Android屏幕的纯代码界面适配
Android中一个layout想适配各种屏幕尺寸那么你需要按以下规则去写layout:
1. 尽量使用wrap_content、match_parent、weight 来规定layout的大小。
2. 要确保布局的灵活性并适应各种尺寸的屏幕,应使用 “wrap_content” 和 “match_parent” 控制某些视图组件的宽度和高度。
3. 使用 “wrap_content”,系统就会将视图的宽度或高度设置成所需的最小尺寸以适应视图中的内容,而 “match_parent”(在低于 API 级别 8 的级别中称为“fill_parent”)则会展开组件以匹配其父视图的尺寸。
4. 如果使用 “wrap_content” 和 “match_parent” 尺寸值而不是硬编码的尺寸,视图就会相应地仅使用自身所需的空间或展开以填满可用空间。此方法可让布局正确适应各种屏幕尺寸和屏幕方向。
5. 如果某些地方必须要规定控件的大小,那么要使用dp 或者 dip单位。
6. 字段必须使用 sp单位。
7. 将不同的图片放到不同的drawable目录下,分辨率的匹配规则如下:
drawable-mdpi 320 * 480
drawable-hdpi 480*800
drawable-xhdpi 720 * 1280
drawable-xxhdpi 1080 * 1920
drawable-xxxhdpi 1080+
‘柒’ android如何适配不同分辨率
Android应用如何适配不同分辨率的手机,主要分三块考虑:
1.界面配置,根据不同的分辨率,创建手机界面文件
例子:
在res下创建 layout-800x480,layout-480x320,并在各自不同分辨率的文件夹下创建界面文件
2.图片配置,不同的分辨率,界面的长宽比不一致,需要不同规格的图片,在drawable-hdpi,drawable-ldpi,drawable-mdpi 中放不同分辨率的图片.
注:为了减小整个应用程序安装包大小,选用最高分辨率适配,特殊界面图片特殊处理.
3.动态实现的界面,样式的设定,不同分辨率,界面的字体大小,字体等需要不同的样式,且需要动态生成的情况下,需要把不同分辨率的配置信息保存到应用中。
例子:
在RES里创建 values-480x320 values-800x400 value-1280x720,并在创建的文件夹中分别创建dimens.xml,<dimen name="Text_size">30px</dimen>,在程序中直接调R.dimen.Text_sizeint sizeOfText = (int) this.getResources().getDimension(R.dimen.Text_size);
注:实际应用发现,字体大小适配时,比如只适配了如下屏幕字体
values-480x320 values-800x480 value-1280x720当出现手机屏幕分辨率为 854x480时会自动找最大字体适配 (value-1280x720).
总结:如果字体800x480以上没有适配,手机自动按最大分辨率适配.
‘捌’ Android的界面是如何适配多样化屏幕
在研究Android的icon设计之前,有必要先了解Android的界面是如何适配多样化屏幕的。
适配性
上一篇博文中提到,由于同一个UI元素(如100 x100像素的图片)在高精度的屏幕上要比低精度的屏幕上看起来要小,为了让这两个屏幕上的图片看起来效果差不多,可以采用以下两种方法:
程序将图片进行缩放,但是效果较差。
为这两个精度屏幕的手机各提供一个图片。
但是屏幕的参数多样化,为每一个精度的屏幕都设计一套icon,工作量大并且不能满足程序的兼容性要求,势必要对屏幕的分级,如在160dpi和180dpi的手机屏幕上采用同一套icon,当这套icon在240dpi效果满足不了设计要求,就需要另做一套稍大些的icon。
在Android 1.5以及更早的版本中,只支持3.2″ 屏幕上的HVGA (320×480)分辨率,开发人员也不需要考虑界面的适配性问题。从Android 1.6之后,平台支持多种尺寸和分辨率的设备,这也就意味着开发人员在设计时要考虑到屏幕的多样性。
为了简化设计并且兼容更多的手机屏幕,平台依照尺寸和分辨率对屏幕进行了区分:
三种尺寸:大,中,小。
三种精度:高(hdpi),中(mdpi)和低(ldpi)。
程序可以为这三种尺寸的屏幕提供默认资源,如有需要,还可以为各种精度的屏幕提供资源。在运行时,系统会根据屏幕布局加载正确尺寸或者精度的图片。
iPhone的icon设计就这么简单,iPhone的屏幕只有320×480像素,所以程序没有适配性问题。
参考文章:
《Icon Design Guidelines, Android 2.0》
《iPhone human interface guidelines》
本文由站酷网-zystoo翻译,转载请保留此信息,多谢合作。
‘玖’ android studio 怎么做屏幕适配
一、关于布局适配建议
1、不要使用绝对布局
2、尽量使用match_parent 而不是fill_parent 。
3、能够使用权重的地方尽量使用权重(android:layout_weight)
4、如果是纯色背景,尽量使用android的shape 自定义。
5、如果需要在特定分辨率下适配,可以在res目录上新建layout-HxW.xml的文件夹。比如要适配1080*1800的屏幕(魅族MX3采用此分辨率)则新建layout-1800x1080.xml的文件夹,然后在下面定义布局。Android系统会优先查找分辨率相同的布局,如果不存在则换使用默认的layout下的布局。
二、术语和概念
四种屏幕尺寸分类:: small, normal, large, and xlarge
四种密度分类: ldpi (low), mdpi (medium), hdpi (high), and xhdpi (extra high)
需要注意的是: xhdpi是从 Android 2.2 (API Level 8)才开始增加的分类.
xlarge是从Android 2.3 (API Level 9)才开始增加的分类.
DPI是“dot per inch”的缩写,每英寸像素数。
一般情况下的普通屏幕:ldpi是120,mdpi是160,hdpi是240,xhdpi是320。
三、如何做到自适应屏幕大小呢?
1)界面布局方面
需要根据物理尺寸的大小准备5套布局,layout(放一些通用布局xml文件,比如界面中顶部和底部的布局,不会随着屏幕大小变化,类似windos窗口的title bar),layout-small(屏幕尺寸小于3英寸左右的布局),layout-normal(屏幕尺寸小于4.5英寸左右),layout-large(4英寸-7英寸之间),layout-xlarge(7-10英寸之间)
2)图片资源方面
需要根据dpi值准备5套图片资源,drawable,drawalbe-ldpi,drawable-mdpi,drawable-hdpi,drawable-xhdpi
Android有个自动匹配机制去选择对应的布局和图片资源
四、两种获取屏幕分辨率信息的方法:
DisplayMetrics metrics = new DisplayMetrics();
Display display = activity.getWindowManager().getDefaultDisplay();
display.getMetrics(metrics);
//这里得到的像素值是设备独立像素dp
//DisplayMetrics metrics=activity.getResources().getDisplayMetrics(); 这样获得的参数信息不正确,不要使用这种方式。
不能使用android.content.res.Resources.getSystem().getDisplayMetrics()。这个得到的宽和高是空的。
‘拾’ android适配器怎样进行数据适配
顾名思义,就是把一些数据给弄得适当,适合以便于在View上显示。适配器就像显示器,把复杂的东西按人可以接受的方式来展现。也可以这样来理解适配器,ListView通过适配器,理解我们要对ListView里加入什么内容,而我们在适配器里@Override的方法,就是让我们写上我们要告诉这个ListView的一些基本内容。
可以说适配器就是数据和视图之间的桥梁,学好适配器还是非常重要的。
让我们先从各个方面理解适配器,然后看一些例子我想应该就可以彻底掌握它了!
适配器的工作原理:
适配器是怎么处理得到的数据,并把它显示出来的呢?其实很简单,说白了适配器它也是一个类,在类里面它实 现了父类的这几个方法:
public int getCount() //得到数据的行数
public Object getItem(int position) //根据position得到某一行的记录
public long getItemId(intposition) //的到某一条记录的ID
还有最重要的:
publicView getView(intposition, View convertView, ViewGroup parent)
//相比于其它几个方法这个方法是最重要的,它显式的定义了适配器将要以什么样的方式去显示我们所 填充的数据,在自定义的适配器里面我们通常会给它写个布局文件。
这些在最后的一两个例子里会仔细讲解,我们从简单的看起:首先看看常用的适配器
我们常用的适配器一共有三个,当然不包含自定义的适配器:就是ArrayAdapter,SimpleAdapter,SimpleCursorAdapter 这三个,他们都是继承于BaseAdapter 。
下面我会逐一介绍,我们在具体应用中来继续学习Adapter:
说道Adapter不得不说道ListView,或者说用到ListView不得不提到Adapter
在android开发中ListView是比较常用的组件,它以列表的形式展示具体内容,并且能够根据数据的长度自适应显示。
而列表的显示需要三个元素:
1.ListVeiw 用来展示列表的View。
2.适配器 用来把数据映射到ListView上的中介。
3.数据 具体的将被映射的字符串,图片,或者基本组件。
根据列表的适配器类型,列表分为三种,ArrayAdapter,SimpleAdapter和SimpleCursorAdapter
其中以ArrayAdapter最为简单,只能展示一行字。SimpleAdapter有最好的扩充性,可以自定义出各种效果。SimpleCursorAdapter可以认为是SimpleAdapter对数据库的简单结合,可以方面的把数据库的内容以列表的形式展示出来
我们从最简单的ListView开始(ArrayAdapter):
我打算把这几种适配器的例子放在一个app里面,然后上传到我的资源,再分享链接给大家。所以我打算由MainActivity里的Button来跳转到各个例子,现在让我们一步步的把这个Demo写出来。
项目开始啦!
(1)首先,新建一个app ,名字叫做 AdapterDemo ,先在activity_main.xml里添加一个button,一会跳转的时候使用。
(2)然后新建一个类ArrayAdapterDemo继承自Activity作为我们第一个小例子的Activity,@Override 我们的onCreate方法
新建一个xml文件arrayadapterdemo.xml作为我们的布局文件,其中包含一个文本域和一个ListView,代码如下:
arrayadapterdemo.xml:
?
1
2
3
4
5
6
7
8
9
10
<!--?xml version="1.0" encoding="utf-8"?-->
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical">
<textview android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="这是ArrayAdapter的一个例子">
</textview>
<listview android:id="@+id/arrayadapterdemolistview" android:layout_width="wrap_content" android:layout_height="wrap_content">
</listview>
</linearlayout>
(3)然后回到ArrayAdapterDemo,定义一个Listview暂且叫做lv,并且lv=(ListView)findViewById(R.id.arrayadapterdemolistview); ,setContentView()为刚才的xml布局,然后为lv设置一个适配器,这里使用的是安卓原生的ArrayAdapter(Context context, inttextViewResourceId, List objects)来装配数据,要装配这些数据就需要一个连接ListView视图对象和数组数据的适配器 来两者的适配工作。
ArrayAdapter的构造需要三个参数,依次为:this,布局文件(注意这里的布局文件描述的是列表的每一行的布局, android.R.layout.simple_list_item_1是系统定义好的布局文件只显示一行文字,数据源(一个List集合)。同时用setAdapter()完 成适配的最后工作。
一般写一个getData()方法来作为最后一个参数,最终代码如下:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package com.example.adapterdemo;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
public class ArrayAdapterDemo extends Activity {
private ListView lv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.arrayadapterdemo);
lv=(ListView)findViewById(R.id.arrayadapterdemolistview);
lv.setAdapter(new ArrayAdapter<string>(this,
android.R.layout.simple_expandable_list_item_1, getData()));
}
public List<string> getData(){
List<string> data = new ArrayList<string>();
data.add("测试数据1");
data.add("测试数据2");
data.add("测试数据3");
data.add("测试数据4");
return data;
}
}
</string></string></string></string>
再在AndroidManifest.xml中注册Activity并在主界面中完成button监听跳转就可以了。