让 Android 支持下拉刷新(Pull Refresh)

曾几何时,自 Android 发布之后一直以来就被管以 Geek 的玩具,而不太注重界面设计和用户交互设计,这让 Android 开发者也顺其自然的接受了这个不好的头衔,但我一度认为这只是不思进取的行为,谁说 Android 就不能像 iPhone 的界面那样设计,我认为只有用心,没神马不能实现的。说回正题,第一次看到 Android 有这项功能的莫过于改版后的 Twitter,我认为它绝对是一个标榜性的 App(同时也包括已开源许久的 Foursquare)。于是全世界的开发者就开始寻思这个效果 Twitter 是如何实现的,于是就有了…

这是由 johannilsson 以及众位其好友的研究成果,并已 Apache 2.0 协议开源托管在 Github:https://github.com/johannilsson/android-pulltorefresh

大概看了一下源码,发现和我初步的想法类似,除了需要集成系统的 ListView 之外,只能在 HeaderView 上面做文章,外加配合 onTouchEvent, onScroll 事件可以捕捉用户下拉和上滑的事件监听。

用法:

Layout



Activity

// Set a listener to be invoked when the list should be refreshed.
((PullToRefreshListView) getListView()).setOnRefreshListener(new OnRefreshListener() {
    @Override
    public void onRefresh() {
        // Do work to refresh the list here.
        new GetDataTask().execute();
    }
});

private class GetDataTask extends AsyncTask {
    ...
    @Override
    protected void onPostExecute(String[] result) {
        mListItems.addFirst("Added after refresh...");
        // Call onRefreshComplete when the list has been refreshed.
        ((PullToRefreshListView) getListView()).onRefreshComplete();
        super.onPostExecute(result);
    }
}

仓库里除了实现类外,还有一个实例,看看人家够意思吧。

如何让 iOS 和 Android 支持自定义字体

本篇教程的目前源于我们团队设计师一直询问,iOS(iPhone/iPad) 和 Android 两个平台是否支持自定义字体的问题,恰巧前不久唐茶计划出了一个关于在中文阅读新体验的电子书应用:失控。里面提到中文的显示采用了香港字体设计室的全新中文黑体字:信黑体。于是我就在想看来 iOS 是可以支持自定义字体的。通过搜索和研究整理如下,供自己备份和大家参考

iOS

iOS 对字体以样式的支持是非常有限的(内嵌默认字库列表),尤其说对于用习惯了 HTML + CSS,就觉得 iOS 对字体的扩展真是逊到渣了,当然高人们已经准备为大众造福,出现了轻巧的 FontLableTTTAttributedLabel 开源库到怪兽级别 Three20 开源框架。但假如仅仅是想加载自定义字体来说,对于 iOS 4 版本还是比较简单的:

  1. 添加自定义字体文件做资源文件添加到 XCode 项目之中
  2. 在 info.plist 中新增一个名为 UIAppFonts 的 Key,类型是数组(array)
  3. 把新增的字体的文件名(包括后缀)依次填入 UIAppFonts 数组 (注意区分大小写)
  4. 保存 info.plist(废话)。准备工作完毕,下面是编码部分
@implementation CustomFontLabel

- (id)initWithCoder:(NSCoder *)decoder
{
    if (self = [super initWithCoder: decoder])
    {
        [self setFont: [UIFont fontWithName: @"Custom Font Name" size: self.font.pointSize]];
        // 这里 Custom Font Name 并不是字体的文件名,而且系统注册显示的字体标准名称,比如
        // 比如,微软雅黑,最好就用 Microsoft YaHei (不过这个会存在版权问题把 XD)
        // 另外,注意区分大小写
    }
    return self;
}

@end

这里还有更完整的关于 iOS 不同平台支持自定义字体的问答。

Android

Android 默认支持  Droid Sans,Droid Sans Mono 和 Droid Serif 三种字体,其实对于中文的显示还是很不错的,有些类似于微软雅黑字体(区别)。假如只是对默认的字体进行更换,最简单的方法就是配置 layout 文件:



    
     
     

但是这样肯定不能满足大家对于字体排版高一级的要求,下面是支持自定义字体的步骤:

首先,添加自定义字体文件放在项目的 assets/fonts 目录下面(目录可能需要自己创建)。

其次,编辑 layout 文件(这里做一个示范)



    
    

最后,在代码部分实现自定义字体(和 iOS 类似)

public void onCreate(Bundle savedInstanceState)
{
       super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        TextView textView = null;
        Button button = null;

        setFont(textView, "fonts/YaHei.ttf", R.id.text_view);
        setFont(button, "fonts/YaHei.ttf", R.id.button);
}

void setFont(TextView name, String path, int res)
{
    	name = (TextView) findViewById(res);
        Typeface font = Typeface.createFromAsset(this.getAssets(), path);
        name.setTypeface(font);
}

扩展阅读 [1] [2]

话说,为什么 Android 到现在都没有更多的开源的库和框架呢?

如何在开发和发布环境使用 Android Map Key

在项目中第一次使用并涉及 Google Map 的功能,而由于 Google 的限制,Google Map 模块出来需要单独下载模块之外,对于每一个应用还都必须具有一个 Google Map Key,这点和使用 Web 开发调用 Google Map API 是一致的。

对于 Android 采用的 Google Map Key 来说,是由一串 MD5 值(类似这样:94:1E:43:49:87:73:BB:E6:A6:88:D7:20:F1:8E:B5:98)生成的。那么这个 MD5 是哪来的呢?

1. 开发环境的 Google Map Key

这个比较简单,网上大面积教程所采用的 android 系统默认带有一个 debug.keystore。假如开发使用 Eclipse,在其 windows -> Preference -> Android -> Build 下,其中 Default debug keystore 的值便是 debug.keystore 的路径。

在命令行或者终端执行下面命令(注意指明 debug.keystore 的路径)即可获取到 MD5 值。

keytool -list -keystore debug.keystore

2. 发布环境的 Google Map Key

假如你的应用需要上线到官方的 Google Market 上面,则需要根据其 apk 的签名证书(keystore)的 MD5 值去生成,方法也很简单,发布的签名同样可以使用 Eclipse 的 Export 工具制作。制作完毕后(或许这个生成的签名没有 .keystore 后缀,不用在意)。同样也使用上面的命令获取其 MD5 值。

# 比如,证书路径 /home/icyleaf/android/ews
keytool -list -keystore /home/icyleaf/android/ews
...
#  查询到了 MD5 值
Certificate fingerprint (MD5): 94:1E:43:49:87:73:BB:E6:A6:88:D7:20:F1:8E:B5:98

使用其 MD5 值在 Sign Up for the Android Maps API 页面填写生成即可。

接下来的步骤就没什么了,又是搜索出千篇一律的教程,大家 Google 之。