Pages:  1 2 ... 5 6 7 8 9 10 11 12
Android – Page 9 – lytsing's Blog

Category: Android

  • Android 2.2 Market 依赖包

    从2.1 到 Android 2.2(Froyo),变化是蛮大的,Android 2.1 安装market,需要装一大驼的东东:

    /etc/permissions/com.google.android.datamessaging.xml
    /etc/permissions/com.google.android.gtalkservice.xml
    /system/framework/com.google.android.gtalkservice.jar
    /system/app/EnhancedGoogleSearchProvider.apk
    /system/app/GoogleCheckin.apk
    /system/app/GoogleApps.apk
    /system/app/gtalkservice.apk
    /system/app/SetupWizard.apk
    /system/app/Vending.apk
    /system/app/TalkProvider.apk

    到了 2.2 只用两个包就搞定:
    /system/app/GoogleServicesFramework.apk
    /system/app/Vending.apk

    第一个,美其名曰:Google服务框架,整合了很多东西,2.1版本的Vending.apk login部分,也整合到了GoogleServicesFramework.apk,系统更新也在这包里。

    具体的包,网上搜 Android 2.2的ROM,多的是。中间遇到了一个问题,就是无法建立帐号,在添加帐号,点公司/Goolge 这两项都无响应,开始怀疑是AccountAndSyncSettings.apk 这个包有问题。后面查出打开wifi后,kernel没有上报消息,状态栏没显示wifi的图标。

  • ListView 分段显示

    Android market里软件列表,每页显示10条记录,没有显示上一页,下一页的按钮,依靠手滑动动态加载数据,当向下滚动时,最下边显示 Loading… 。数据加载结束,Loading底栏消失。

    关于ListView的分段显示,有现成的库可用,比如 cwac-endless, 这个库不好之处,就是底部Loading的View无法定制。还有一个在google code上的androidpageablelistview 这个可以实现基本的分页,有手动操作显示上一页,下一页的按钮。

    实现思路如下:
    自定义 footer view, list_footer.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        >
        <LinearLayout
            android:gravity="center_vertical|center_horizontal"
            android:orientation="horizontal"
            android:id="@+id/loading_more"
            android:visibility="gone"
            android:layout_width="fill_parent"
            android:layout_height="?android:attr/listPreferredItemHeight"
            >
            <ProgressBar
                android:id="@+android:id/progress_large"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:indeterminate="true"
                style="?android:attr/progressBarStyleSmall"
                >
            </ProgressBar>
            <TextView
                android:id="@+id/loading_msg"
                android:paddingLeft="6.0dip"
                android:paddingTop="2.0dip"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginBottom="1.0dip"
                android:text="@string/loading"
                >
            </TextView>
        </LinearLayout>
    </LinearLayout>

    用到 ListView addFooterView/removeView 这两个函数。

    伪代码 (Pseudocode):

    private ListView mListView;
    private View mFooterView;
    private OnScrollListener mOnListViewScrollListener;
    
    mListView.addFooterView(mFooterView);
    
    mListView.removeView(mFooterView);
    
    mListView.setOnScrollListener(mOnListViewScrollListener);
    
    mOnListViewScrollListener = new OnScrollListener() {
    
        public void onScroll(AbsListView view, int firstCell, int cellCount,
                int itemCount) {
            if (firstCell != mFirstCell) {
                // balabala
            }
        }
    
        public void onScrollStateChanged(AbsListView view, int scrollState) {
            // Do nothing
        }
    }; 

    在onScroll里要处理检查是否还有新的记录,如果有,调用addFooterView,添加记录到adapter, adapter调用 notifyDataSetChanged 更新数据;如果没有记录了, 把自定义的mFooterView去掉。这里没有重写onScrollStateChanged函数,那么在onScroll就需要一个外部变量mFirstCell记录滑动位置。

    再看看QQ空间体验版 for Android 是如何实现的,不用多说,show me the code:

    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
        shouldRefresh = false;
    
        if (firstVisibleItem + visibleItemCount == totalItemCount) {
            if (bHaveMore()) {
                if (list.getFooterViewsCount() == 0) {
                    addRefreshfoot();
                } else {
                    shouldRefresh = true;
                }
            }
        }
    }
    
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        if (shouldRefresh && scrollState == OnScrollListener.SCROLL_STATE_IDLE) {
            if (isRefreshing == false) {
                isRefreshing = true;
                getMoreList();
            }
        }
    } 
  • 自定义ProgressBar Style

    在前面写过一篇 《 Android Market的 Loading效果》,有贴出ProgressBar的图片,圆形的环是橙黄色的,从Android 2.0后,UI发生了变化,见下图。

    拿QQ空间来做例子吧:

    非常的简单,新建一个styles.xml文件,

    <?xml version="1.0" encoding="UTF-8"?>
    <resources>
        <style name="qZoneListProgressStyle" parent="@android:style/Widget.ProgressBar.Small">
            <item name="android:indeterminateDrawable">@anim/loading</item>
        </style>
    </resources>

    写了个简单的示范例子,代码:qzoneLoading.tar 或在github上也可以下载 https://github.com/lytsing/qzoneLoading,效果图为:

    留意了一下UC浏览器的进度loading:

    开始也以为是修改styles即可,反编译一下,才知道是在新建一个DrawWaitingPage.java类绘画. 大概是用到Paint,Canvas,Timer之类的,自定义一个View。

  • Android播放gif格式图片

    关于gif的播放,Android ApiDemos给出一个实例:

    ApiDemos/src/com/example/android/apis/graphics/BitmapDecode.java

    小的gif图片用Movie播放还行,大一点的就搞不定了。官方文档说不推荐使用gif格式的。解析gif要占很大的内存,不过你可以把gif分解成N张png格式的,用AnimationDrawable来播放。在MTK,展信平台上,一些连续动画的游戏,也是采用这样样的方法,分解gif为N多个Frame,做过Flash的网页设计师应该是很熟悉了。

    在res/anim目录下创建相应的xml文件,举个例子: girl_kiss.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="true" android:visible="true">
    <item android:drawable="@drawable/kiss_frame00_160ms" android:duration="160" />
    <item android:drawable="@drawable/kiss_frame01_160ms" android:duration="160" />
    <item android:drawable="@drawable/kiss_frame02_160ms" android:duration="160" />
    <item android:drawable="@drawable/kiss_frame03_160ms" android:duration="160" />
    <item android:drawable="@drawable/kiss_frame04_160ms" android:duration="160" />
    <item android:drawable="@drawable/kiss_frame05_160ms" android:duration="160" />
    <item android:drawable="@drawable/kiss_frame06_160ms" android:duration="160" />
    <item android:drawable="@drawable/kiss_frame07_160ms" android:duration="160" />
    <item android:drawable="@drawable/kiss_frame08_160ms" android:duration="160" />
    <item android:drawable="@drawable/kiss_frame09_160ms" android:duration="160" />
    <item android:drawable="@drawable/kiss_frame10_160ms" android:duration="160" />
    <item android:drawable="@drawable/kiss_frame11_160ms" android:duration="160" />
    <item android:drawable="@drawable/kiss_frame12_160ms" android:duration="160" />
    <item android:drawable="@drawable/kiss_frame13_160ms" android:duration="160" />
    <item android:drawable="@drawable/kiss_frame14_160ms" android:duration="160" />
    <item android:drawable="@drawable/kiss_frame15_0ms" android:duration="0" />
    </animation-list>

    然后在主程序通过AnimationDrawable来操作。

  • android 字符串格式化

    发现没啥好写的,提供个链接吧,查阅方便。

    一般用到 String.format与Html.fromHtml
    官方上有详细介绍:
    http://developer.android.com/guide/topics/resources/string-resource.html

    有段时间看了日历的代码,发现Plurals有 xliff 字样,搜索一下,小日本写的
    http://linkyou-blog.blogspot.com/2010/02/previously-on-my-last-blog.html
    终于弄明白了。

    读一些代码,发现string.xml里还发现一些蛮有用的技巧,直接写Unicode码:
    用 \u0020 表示空格。
    用 \u2026 表示省略号。

    android提供的android.text.format 也很有用,比如 Formatter 提供的
    public static String formatFileSize(Context context, long number)
    就很好用,很多人估计是不知道,自个儿写了这样的函数,重复造车轮。