Pages:  1 2 August 2010 – Page 2 – lytsing's Blog

Month: August 2010

  • 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)
    就很好用,很多人估计是不知道,自个儿写了这样的函数,重复造车轮。

  • Android 反编译中的 $assertionsDisabled

    很久以前看了一些apk经过反编译后得到的 .dex 格式文件,发现有assertionsDisabled, 不解记录之,今天翻看以前的工作日志,于是写个程序验证。

    .field static final $assertionsDisabled Z
    
    .method static <clinit>()V
    .limit registers 1
    .line 85
     16     const-class v0,org/lytsing/android/Assert
     17 ; v0 : Ljava/lang/Class;
     18     invoke-virtual  {v0},java/lang/Class/desiredAssertionStatus ; desiredAssertionStatus()Z
     19 ; v0 : Ljava/lang/Class;
     20     move-result v0
     21 ; v0 : single-length
     22     if-nez  v0,l1c6ac
     23 ; v0 : single-length
     24     const/4 v0,1
     25 ; v0 : single-length
     26 l1c6a6:
     27     sput-boolean    v0,org/lytsing/android/Assert$assertionsDisabled Z
     28 ; v0 : Z
     29     return-void
     30 l1c6ac:
     31     const/4 v0,0
     32 ; v0 : single-length
     33     goto    l1c6a6
     34 .end method

    在某个函数调用:

    110     .line 153
    111     sget-boolean v0, Lorg/lytsing/android/Assert;->$assertionsDisabled:Z
    112 
    113     if-nez v0, :cond_0
    114 
    115     array-length v0, p2
    116 
    117     array-length v1, p4
    118 
    119     if-eq v0, v1, :cond_0
    120 
    121     new-instance v0, Ljava/lang/AssertionError;
    122 
    123     invoke-direct {v0}, Ljava/lang/AssertionError;-><init>()V
    124 
    125     throw v0

    好像很复杂, 其实仅仅一行代码:

    assert conIds.length == stringIds.length;

    就产生了上面一坨的代码。