基本概念

  1. 分辨率,即手机屏幕的像素点数,一般描述为宽×高,Android常见的分辨率有480×800720×12801080×1920
  2. 屏幕大小,即手机屏幕对角线的物理尺寸,以英寸(inch)为单位(1英寸=2.54厘米)
  3. 像素密度(dpi:dots per inch或PPI:pixels per inch),即每英寸的像素点数,数值越高显示越细腻
    如下图:分辨率为1080×1920,尺寸为5英寸,根据勾股定理对角线的像素约2203,那么像素密度大约为440

密度分级

因为手机的像素密度千奇百怪,在屏幕适配的时候必须按一定规则分类,于是有了密度分级,每部Android手机都有一个初始的固定密度,120、160、320、480……通常情况240×320的屏幕是低密度120dpi即ldpi,320×480为中密度160dpi即mdpi,480*800为高密度240dpi即hdpi,720×1280为超高密度320dpi即xhpi,1080×1920为超超高密度480dpi即xxhdpi

dp密度无关的像素

dp也成为dip即density-independent pixel,为了实现在不同分辨率的屏幕上显示“看上去”一样大小需要使用dp来指定尺寸。
文字尺寸一般使用sp即scale-independentpixel,这样字体的大小就会随着系统设置调节字号的大小而改变

dp与px的转换

像素密度为160dpi的中密度手机屏幕为基准屏幕,即320×480的屏幕,此时1dp=1px
像素密度为240dpi的高密度屏幕,即480×800的屏幕,为了显示一张在320×480屏幕“看上去”一样大小的尺寸,需要把尺寸放大1.5倍,此时1dp=1.5px
一次类推dp在不同像素密度下的比例为:ldpi:mdpi:xhdpi:xxhdpi=3:4:6:8:12,间隔数字之间是2的倍数

当Android系统字号设为“普通”时,sp与px的尺寸换算和dp与px一样

建议

目前市面上普遍的机型为720×1280即xhdpi,此时1dp=2px,图片资源放在drawable-xhdpi文件夹中

  • android:gravity 用于设置View中内容相对于View组件的对齐方式
  • android:layout_gravity 用于设置View组件相对于Container的对齐方式

  • httplib.HTTPConnection(host,[,port,[,strict,[,timeout]]])
    表示一次与服务器的交互,即请求/响应。host表示服务器主机,port表示端口号(默认值是80),参数strict默认值为false,表示在无法解析服务器返回的状态行时(status line)是否剖出BadStatusLine异常,可选参数timeout表示超时时间
    • HTTPConnection.request(method,url,[,body[,headers]])
      发送一次请求,method表示请求方法,url表示请求资源,body表示提交服务器的数据,必须是字符串,headers表示请求的http头
    • HTTPConnection.getresponse()
      获取Http 响应
    • HTTPConnection.connect()
      连接到HTTP服务器
    • HTTPConnection.close()
      关闭与服务器连接
    • HTTPConnection.set_debuglevel(level)
      设置调试级别,参数level默认为0,表示不输出任何调试信息
  • httplib.HTTPResponse 表示服务器对客户端的相应,通过HTTPConnection.getresponse()来创建
    • HTTPResponse.read([amt])
      获取响应的消息体,如果请求的是一个普通的网页,该方法返回页面的html,可选参数amt表示从响应流中读取指定字节的数据
    • HTTPResponse.getheader(name[, default])
        获取响应头。Name表示头域(header field)名,可选参数default在头域名不存在的情况下作为默认值返回。
    • HTTPResponse.getheaders()
        以列表的形式返回所有的头信息。
    • HTTPResponse.msg
        获取所有的响应头信息。
    • HTTPResponse.version
        获取服务器所使用的http协议版本。11表示http/1.1;10表示http/1.0。
    • HTTPResponse.status
        获取响应的状态码。如:200表示请求成功。
    • HTTPResponse.reason
         返回服务器处理请求的结果说明。一般为”OK”
1
2
3
4
5
6
7
8
9
10
headers = {"Content-type": "application/x-www-form-urlencoded"
, "Accept": "text/plain"}
values = {'param1':'2','param2':'3'}
params = urllib.urlencode(values)
conn = httplib.HTTPConnection("ave.bolyartech.com")
conn.request("POST", "/params.php", params,headers)
response = conn.getresponse()
print response.status, response.reason
print response.read()
conn.close();

  • Ctrl + o快速跳转可以搜索(显示大纲)
  • Ctrl + 上下键移动行
  • Ctrl + shift + r搜索文件
  • Ctrl + m最大化编辑窗口
  • Ctrl + shift + o导入包
  • Ctrl + 1快速修复
  • Ctrl + pageup/pagedown选项卡切换
  • Ctrl + W关闭当前编辑框
  • Ctrl + d删除行
  • Ctrl + shift + F4关闭所有编辑框
  • Ctrl + shift + X选中文本全部大写
  • Ctrl + shift + Y选中文本全部小写
  • Ctrl + shift + F格式化当前代码
  • Shift + Enter插入空行
  • Ctrl + shift + T查找Java类文件
  • Ctrl + shift + G查找引用
  • Ctrl + K高亮代码
  • Alt + shift + R重命名

位置

在Android Frameworks/base/core/res/res/values目录下

  • themes.xml
  • themes_device_defaults.xml
  • styles.xml
  • styles_device_defaults.xml

主题Theme

theme.xml定义了Android低版本的theme和Holo theme,themes_device_defaults.xml定义了DeviceDefault主题(继承自Holo主题)
系统如何选择默认主题呢?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**frameworks/base/core/java/android/content/res/Resources.java*/
public static int selectDefaultTheme(int curTheme, int targetSdkVersion) {
return selectSystemTheme(curTheme, targetSdkVersion,
com.android.internal.R.style.Theme,
com.android.internal.R.style.Theme_Holo,
com.android.internal.R.style.Theme_DeviceDefault);
}

public static int selectSystemTheme(int curTheme, int targetSdkVersion,
int orig, int holo, int deviceDefault) {
if (curTheme != 0) {
return curTheme;
}
if (targetSdkVersion < Build.VERSION_CODES.HONEYCOMB) {
// < 11
return orig;
}
if (targetSdkVersion < Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
// < 14
return holo;
}
return deviceDefault;
}

当<11时使用低版本主题,>=11&&<14时使用Holo主题,>14时,使用DeviceDefault主题

系统主题Theme列表

系统默认大的主题是三种:Theme,Theme.Holo,Theme.DeviceDefault, 但是实际上在此基础系统还定义了大量的派生主题,最典型的是对应的Light主题。

详解每个主题item分类

  1. 颜色

    1
    2
    3
    4
    5
    6
    7
    8
    9
    <item name="colorForeground">@android:color/bright_foreground_dark</item>
    <item name="colorForegroundInverse">@android:color/bright_foreground_dark_inverse</item>
    <item name="colorBackground">@android:color/background_dark</item>
    <item name="colorBackgroundCacheHint">?android:attr/colorBackground</item>
    <item name="colorPressedHighlight">@color/legacy_pressed_highlight</item>
    <item name="colorLongPressedHighlight">@color/legacy_long_pressed_highlight</item>
    <item name="colorFocusedHighlight">@color/legacy_selected_highlight</item>
    <item name="colorMultiSelectHighlight">@color/legacy_selected_highlight</item>
    <item name="colorActivatedHighlight">@color/legacy_selected_highlight</item>
  2. 字体

    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    <item name="textAppearance">@android:style/TextAppearance</item>
    <item name="textAppearanceInverse">@android:style/TextAppearance.Inverse</item>

    <item name="textColorPrimary">@android:color/primary_text_dark</item>
    <item name="textColorSecondary">@android:color/secondary_text_dark</item>
    <item name="textColorTertiary">@android:color/tertiary_text_dark</item>
    <item name="textColorPrimaryInverse">@android:color/primary_text_light</item>
    <item name="textColorSecondaryInverse">@android:color/secondary_text_light</item>
    <item name="textColorTertiaryInverse">@android:color/tertiary_text_light</item>
    <item name="textColorPrimaryDisableOnly">@android:color/primary_text_dark_disable_only</item>
    <item name="textColorPrimaryInverseDisableOnly">@android:color/primary_text_light_disable_only</item>
    <item name="textColorPrimaryNoDisable">@android:color/primary_text_dark_nodisable</item>
    <item name="textColorSecondaryNoDisable">@android:color/secondary_text_dark_nodisable</item>
    <item name="textColorPrimaryInverseNoDisable">@android:color/primary_text_light_nodisable</item>
    <item name="textColorSecondaryInverseNoDisable">@android:color/secondary_text_light_nodisable</item>
    <item name="textColorHint">@android:color/hint_foreground_dark</item>
    <item name="textColorHintInverse">@android:color/hint_foreground_light</item>
    <item name="textColorSearchUrl">@android:color/search_url_text</item>
    <item name="textColorHighlight">@android:color/highlighted_text_dark</item>
    <item name="textColorHighlightInverse">@android:color/highlighted_text_light</item>
    <item name="textColorLink">@android:color/link_text_dark</item>
    <item name="textColorLinkInverse">@android:color/link_text_light</item>
    <item name="textColorAlertDialogListItem">@android:color/primary_text_light_disable_only</item>

    <item name="textAppearanceLarge">@android:style/TextAppearance.Large</item>
    <item name="textAppearanceMedium">@android:style/TextAppearance.Medium</item>
    <item name="textAppearanceSmall">@android:style/TextAppearance.Small</item>
    <item name="textAppearanceLargeInverse">@android:style/TextAppearance.Large.Inverse</item>
    <item name="textAppearanceMediumInverse">@android:style/TextAppearance.Medium.Inverse</item>
    <item name="textAppearanceSmallInverse">@android:style/TextAppearance.Small.Inverse</item>
    <item name="textAppearanceSearchResultTitle">@android:style/TextAppearance.SearchResult.Title</item>
    <item name="textAppearanceSearchResultSubtitle">@android:style/TextAppearance.SearchResult.Subtitle</item>

    <item name="textAppearanceEasyCorrectSuggestion">@android:style/TextAppearance.EasyCorrectSuggestion</item>
    <item name="textAppearanceMisspelledSuggestion">@android:style/TextAppearance.MisspelledSuggestion</item>
    <item name="textAppearanceAutoCorrectionSuggestion">@android:style/TextAppearance.AutoCorrectionSuggestion</item>

    <item name="textAppearanceButton">@android:style/TextAppearance.Widget.Button</item>

    <item name="editTextColor">@android:color/primary_text_light</item>
    <item name="editTextBackground">@android:drawable/edit_text</item>

    <item name="candidatesTextStyleSpans">@android:string/candidates_style</item>

    <item name="textCheckMark">@android:drawable/indicator_check_mark_dark</item>
    <item name="textCheckMarkInverse">@android:drawable/indicator_check_mark_light</item>

    <item name="textAppearanceLargePopupMenu">@android:style/TextAppearance.Widget.PopupMenu.Large</item>
    <item name="textAppearanceSmallPopupMenu">@android:style/TextAppearance.Widget.PopupMenu.Small</item>
  3. 按钮

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <item name="buttonStyle">@android:style/Widget.Button</item>

    <item name="buttonStyleSmall">@android:style/Widget.Button.Small</item>
    <item name="buttonStyleInset">@android:style/Widget.Button.Inset</item>

    <item name="buttonStyleToggle">@android:style/Widget.Button.Toggle</item>

    <item name="selectableItemBackground">@android:drawable/item_background</item>
    <item name="borderlessButtonStyle">?android:attr/buttonStyle</item>
    <item name="homeAsUpIndicator">@android:drawable/ic_ab_back_holo_dark</item>
  4. List

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <item name="listPreferredItemHeight">64dip</item>
    <item name="listPreferredItemHeightSmall">?android:attr/listPreferredItemHeight</item>
    <item name="listPreferredItemHeightLarge">?android:attr/listPreferredItemHeight</item>
    <item name="dropdownListPreferredItemHeight">?android:attr/listPreferredItemHeight</item>
    <item name="textAppearanceListItem">?android:attr/textAppearanceLarge</item>
    <item name="textAppearanceListItemSmall">?android:attr/textAppearanceLarge</item>
    <item name="listPreferredItemPaddingLeft">6dip</item>
    <item name="listPreferredItemPaddingRight">6dip</item>
    <item name="listPreferredItemPaddingStart">6dip</item>
    <item name="listPreferredItemPaddingEnd">6dip</item>
  5. Window

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <item name="windowBackground">@android:drawable/screen_background_selector_dark</item>
    <item name="windowFrame">@null</item>
    <item name="windowNoTitle">false</item>
    <item name="windowFullscreen">false</item>
    <item name="windowOverscan">false</item>
    <item name="windowIsFloating">false</item>
    <item name="windowContentOverlay">@null</item>
    <item name="windowShowWallpaper">false</item>
    <item name="windowTitleStyle">@android:style/WindowTitle</item>
    <item name="windowTitleSize">25dip</item>
    <item name="windowTitleBackgroundStyle">@android:style/WindowTitleBackground</item>
    <item name="android:windowAnimationStyle">@android:style/Animation.Activity</item>
    <item name="android:windowSoftInputMode">stateUnspecified|adjustUnspecified</item>
    <item name="windowActionBar">false</item>
    <item name="windowActionModeOverlay">false</item>
    <item name="windowCloseOnTouchOutside">false</item>
    <item name="windowTranslucentStatus">false</item>
    <item name="windowTranslucentNavigation">false</item>
  6. Dialog

    1
    2
    3
    4
    <item name="dialogTheme">@android:style/Theme.Dialog</item>
    <item name="dialogTitleIconsDecorLayout">@layout/dialog_title_icons</item>
    <item name="dialogCustomTitleDecorLayout">@layout/dialog_custom_title</item>
    <item name="dialogTitleDecorLayout">@layout/dialog_title</item>
  7. AlertDialog

    1
    2
    3
    4
    <item name="alertDialogTheme">@android:style/Theme.Dialog.Alert</item>
    <item name="alertDialogStyle">@android:style/AlertDialog</item>
    <item name="alertDialogCenterButtons">true</item>
    <item name="alertDialogIcon">@android:drawable/ic_dialog_alert</item>
  8. Panel

    1
    2
    3
    4
    5
    6
    7
    8
    9
    <item name="panelBackground">@android:drawable/menu_background</item>
    <item name="panelFullBackground">@android:drawable/menu_background_fill_parent_width</item>
    <!-- These three attributes do not seems to be used by the framework. Declared public though -->
    <item name="panelColorBackground"># 000</item>
    <item name="panelColorForeground">?android:attr/textColorPrimary</item>
    <item name="panelTextAppearance">?android:attr/textAppearance</item>

    <item name="panelMenuIsCompact">false</item>
    <item name="panelMenuListWidth">296dip</item>
  9. 滚动条(Scrollbar)

    1
    2
    3
    4
    5
    6
    7
    <item name="scrollbarFadeDuration">250</item>
    <item name="scrollbarDefaultDelayBeforeFade">300</item>
    <item name="scrollbarSize">10dip</item>
    <item name="scrollbarThumbHorizontal">@android:drawable/scrollbar_handle_horizontal</item>
    <item name="scrollbarThumbVertical">@android:drawable/scrollbar_handle_vertical</item>
    <item name="scrollbarTrackHorizontal">@null</item>
    <item name="scrollbarTrackVertical">@null</item>
  10. 文字选中(Text selection)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <item name="textSelectHandleLeft">@android:drawable/text_select_handle_left</item>
    <item name="textSelectHandleRight">@android:drawable/text_select_handle_right</item>
    <item name="textSelectHandle">@android:drawable/text_select_handle_middle</item>
    <item name="textSelectHandleWindowStyle">@android:style/Widget.TextSelectHandle</item>
    <item name="textEditPasteWindowLayout">@android:layout/text_edit_paste_window</item>
    <item name="textEditNoPasteWindowLayout">@android:layout/text_edit_no_paste_window</item>
    <item name="textEditSidePasteWindowLayout">@android:layout/text_edit_side_paste_window</item>
    <item name="textEditSideNoPasteWindowLayout">@android:layout/text_edit_side_no_paste_window</item>
    <item name="textSuggestionsWindowStyle">@android:style/Widget.TextSuggestionsPopupWindow</item>
    <item name="textEditSuggestionItemLayout">@android:layout/text_edit_suggestion_item</item>

Material Theme


Material Theme的定义如下

  • @android:style/Theme.Material
  • @android:style/Theme.Material.Light
  • @android:style/Theme.Material.DarkActionBar

自定义主题的基础颜色

1
2
3
4
5
6
7
<resources>
<style name="AppTheme" parent="android:Theme.Material">
<item name="android:colorPrimary">@color/primary</item>
<item name="android:colorPrimaryDark">@color/primary_dark</item>
<item name="android:colorAccent">@color/accent</item>
</style>
</resources>

基本概念

  1. 分辨率:屏幕上显示的像素个数,单位尺寸内像素点越多,显示的图像就越清楚
    主流分辨率:480*800720*12801080*1920
  2. 像素密度
    240dpi(480*800)、320dpi(720*1280)、480dpi(1080*1920)
  3. 单位
    px:像素
    dp:设备独立像素(160dpi为标准)
    240dpi下,1dp=1.5px
    320dpi下,1dp=2px
    480dpi下,1dp=3px
    
    sp:等同于dp,用于描述字体大小
    240dpi下,1sp=1.5px    
    320dpi下,1sp=2px
    480dpi下,1sp=3px
    

常见分辨率

  • 4:3
    VGA 640*480
    QVGA 320*240
    HVGA 480*320
    SVGA 800*600
  • 5:3
    WVGA 800*480
  • 16:9
    FWVGA 854*480
    HD 1920*1080
    QHD 960*540
    720p 1280*720
    1080p 1920*1080
  • Apple
    iPhone4/4s 960*640
    iPhone5/5s 1136*640
    iPhone6 1334*750
    iPhone6Plus 1920*1080
    小米1 854*480
    小米2 1280*720
    红米1/1s/note 1280*720

对应的DPI

  • HVGA mdpi
  • WVGA hdpi
  • FWVGA hdpi
  • QHD hdpi
  • 720p xhdpi
  • 1080p xxhdpi

    最佳方案

  1. 选取320dpi下(720*1280)进行设计,此分辨率下1dp=2px
  2. 对于一切切图资源特殊处理
    输出多套分辨率的切图,例如480p和720p,在设计的时候要注意好切图区域的大小能被2和1.5整除的大小,如48p*48px96*96px等。
  3. 使用相对于单位进行标注

  4. 采用自适应布局

  5. 标注尽量采用相对关系

文字

中文字体:默认为Droid Sans Fallback,设计时可采用微软雅黑。
英文字体:Andriod4.x及以上采用Roboto,Andrio2.x和andriod3.x采用 Droid Sans。建议尽量采用系统默认字体。
Andriod规范建议,字号采用12sp、14sp、18sp、22sp等四个级别来设计。(实际设计时可以按实际情况调整)

总结

  1. 采用720*1280分辨率来进行设计。(设计时,采用偶数值进行设计,方便dp和px的转换)
  2. 开始标注了,标注尽量采用相对位置进行标注。
  3. 切图了,在720*1280下进行切图,可以完全适配720*1280后放大缩小切图资源
  4. 分别适配480*8001080*1920
  5. 不要忘记了,开发完后要进行bug测试(视觉方面的)

使用

作为图片加载库必须设置网络、SD卡权限

1
2
<uses-permission android:name="android.permission.INTERNET" />  
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

  • 设置缓存目录
    1
    2
    3
    File cacheDir = StorageUtils.getOwnCacheDirectory(getApplicationContext(),"imageloader/Cache");
    // 设置ImageLoaderConfiguration
    .discCache(new UnlimitedDiscCache(cacheDir));

配置ImageLoaderConfiguration

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
ImageLoaderConfiguration config = new ImageLoaderConfiguration
.Builder(context)
.memoryCacheExtraOptions(480,800) // 保存的每个文件的最大长宽
.discCacheExtraOptions(480,800,CompressFormat.JPEG,75,null) // 设置详细信息,最好不要设置
.threadPoolSize(3) // 线程池加载的数量
.threadPriority(Thread.NORM_PRIORITY - 2)
.denyCacheImageMultipleSizesInMemory()
.memoryCache(new UsingFreqLimitedMemoryCache(2 * 1024 * 1024)) // 缓存,可以自己实现
.memoryCacheSize(2 * 1024 * 1024)
.discCacheSize(50 * 1024 * 1024)
.discCacheFileNameGenerator(new Md5FileNameGenerator()) // 保存URI名称用MD5加密 可以使用HashCodeFileNameGenerator
.tasksProcessingOrder(QueueProcessingType.LIFO)
.discCacheFileCount(100) // 缓存文件数量
.discCache(new UnlimitedDiscCache(cacheDir)) // 自定义缓存路径
.defaultDisplayImageOptions(DisplayImageOptions.createSimple())
.imageDownloader(new BaseImageDownloader(context,5 * 1000,30 * 1000)) // 连接超时5s,读取超时30s
.writeDebugLogs()
.build(); // 开始构建
ImageLoader.getInstance().init(config);

加载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 获取ImageLoader实例
ImageLoader imageLoader = ImageLoader.getInstance();
// 设置配置
DisplayImageOptions option;
options = new DisplayImageOptions.Builder()
.showImageOnLoading(R.drawable.ic_launcher) // 设置图片在下载期间显示的图片
.showImageForEmptyUri(R.drawable.ic_launcher) // 设置图片Uri为空或者是错误的时候显示的图片
.showImageOnFail(R.drawable.ic_laucher) // 设置图片加载、解码过程错误的时候显示的图片
.cacheInMemory(true) // 设置下载的图片是否缓存在内存中
.cacheOnDisc(true) // 设置下载的图片是否缓存在SD卡中
.considerExifParams(true) // 是否考虑JPEG图像EXIF参数(旋转、翻转)
.imageScaleType(ImageScaleType.EXACTLY_STRETCHED) //设置图片以何种编码方式显示
.bitmapConfig(Bitmap.Config.RGB_565) // 设置图片的解码类型
.decodingOptions(android.graphics.BitmapFactory.Options decodingOptions) // 设置图片的解码配置
.delayBeforeLoading(int delayInMillis) // 下载完的延迟时间
.preProcessor(BitmapProcessor preProcessor) // 设置图片加入缓存前,对bitmap进行设置
.resetViewBeforeLoading(true) // 设置图片在下载前是否重置,复位
.displayer(new RondedBitmapDisplayer(20)) // 是否设置为圆角
.displayer(new FadeInBitmapDisplayer(100)) // 是否显示加载渐入动画
.build(); // 构建完成

不需要的可以不做配置

  1. .imageScaleType(ImageScaleType imageScaleType) 设置图片的缩放方式
    EXACTLY:图像将完全按比例缩小到目标大小
    EXACTLY_STRETCHED:图片会缩放到目标大小
    IN_SAMPLE_INT:图像将被二次采样的整数倍
    IN_SAMPLE_POWER_OF_2:图片将降低2倍,直到下一减少步骤,使图像更小的目标大小
    NONE:图片不会调整
  2. .displayer(BitmapDisplayer displayer) 是设置 图片的显示方式
    RoundedBitmapDisplayer(int roundPixels) 设置圆角图片
    FakeBitmapDisplayer() 这个类什么都没做
    FadeInBitmapDisplayer(int durationMillis) 设置图片渐显的时间
    SimpleBitmapDisplayer() 正常显示一张图片  
    1
    2
    ImageLoader.getInstance().displayImage(imageUrl, imageView); // imageUrl代表图片的URL地址,imageView代表承载图片的IMAGEVIEW控件  
    ImageLoader.getInstance().displayImage(imageUrl, imageView,options); // imageUrl代表图片的URL地址,imageView代表承载图片的IMAGEVIEW控件 , options代表DisplayImageOptions配置文件

加载监听

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
imageLoader.displayImage(imageUrl, imageView, options, new ImageLoadingListener() {  
@Override
public void onLoadingStarted() {
//开始加载的时候执行
}
@Override
public void onLoadingFailed(FailReason failReason) {
//加载失败的时候执行
}
@Override
public void onLoadingComplete(Bitmap loadedImage) {
//加载成功的时候执行
}
@Override
public void onLoadingCancelled() {
//加载取消的时候执行

}});

加载监听进度

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
imageLoader.displayImage(imageUrl, imageView, options, new ImageLoadingListener() {  
@Override
public void onLoadingStarted() {
//开始加载的时候执行
}
@Override
public void onLoadingFailed(FailReason failReason) {
//加载失败的时候执行
}
@Override
public void onLoadingComplete(Bitmap loadedImage) {
//加载成功的时候执行
}
@Override
public void onLoadingCancelled() {
//加载取消的时候执行
},new ImageLoadingProgressListener() {
@Override
public void onProgressUpdate(String imageUri, View view, int current,int total) {
//在这里更新 ProgressBar的进度信息
}
});

注意事项

  1. 权限
  2. 必须初始化ImageLoader.getInstance().init(config)
  3. ImageLoader是根据ImageView的height,width确定图片的宽高
  4. 如果经常出现OOM
    • ①减少配置之中线程池的大小,.(.threadPoolSize)推荐1-5;
      • ②使用.bitmapConfig(Bitmap.config.RGB_565)代替ARGB_8888;
    • ③使用.imageScaleType(ImageScaleType.IN_SAMPLE_INT)或者try.imageScaleType(ImageScaleType.EXACTLY)
      • ④避免使用RoundedBitmapDisplayer.他会创建新的ARGB_8888格式的Bitmap对象;
      • ⑤使用.memoryCache(new WeakMemoryCache()),不要使用.cacheInMemory();

其他

1
2
3
4
5
String imageUri = "http://site.com/image.png"; // from Web  
String imageUri = "file:///mnt/sdcard/image.png"; // from SD card
String imageUri = "content://media/external/audio/albumart/13"; // from content provider
String imageUri = "assets://image.png"; // from assets
String imageUri = "drawable://" + R.drawable.image; // from drawables (only images, non-9patch)

基本请求

1
2
3
4
5
6
7
8
9
10
11
12
13
StringRequest stringRequest = new StringRequest("http://www.baidu.com",new Response.Listener<String>(){
@Override
public void onResponse(String response) {
//
}, new Response.ErrorListener() {
@Override
public void onErrorResopnse(VolleyError error) {
//
}
}
});
// 添加请求道请求队列中
mQueue.add(stringRequest);

三个参数分别是目标服务器的URL地址,服务器响应成功的回调,服务器响应失败的回调

Post

1
2
3
4
5
6
7
8
9
StringRequest stringRequest = new StringRequest(Method.POST,url,listener,errorListenrer) {
@Override
protected Map<String,String> getParams() throws AuthFailureError {
Map<String,String> map = newHash<String,String>();
map.put("params1","value1");
map.put("params2","value2");
return map;
}
}

JsonRequest

JsonRequest是一个抽象类,有两个直接子类,JsonObjectRequest和JsonArrayRequest,分别用于处理JSON数据和JSON数组

1
2
3
4
5
6
7
8
9
10
11
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest("http://m.weather.com.cn/data/101010100.html",null, new Response.Listener<JSONObject>() {  
@Override
public void onResponse(JSONObject response) {
Log.d("TAG", response.toString());
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("TAG", error.getMessage(), error);
}
});

ImageRequest

1
2
3
4
5
6
7
8
9
10
11
12
13
ImageRequest imageRequest = new ImageRequest(
"https://avatars3.githubusercontent.com/u/5416585?v=2&s=460",
new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap response) {
imageView.setImageBitmap(response);
}
},0,0,Config.RGB_565,new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
imageView.setImageResource(R.drawable.default_image);
}
});

第三第四个参数指定允许图片最大的宽度和高度,如果指定的网络图片的宽度或高度大于这里的最大值,则会对图片进行压缩,指定为0即表示不管图片多大都不压缩。

ImageLoader