LayoutInflaterとBlinkLayout

created: 2017/03/26 12:43 updated: 2017/03/26 12:43

暇つぶしにAndroidのLayoutInflaterのソースコードを読んでいたところ、こんなコードを見つけた。

https://github.com/android/platform_frameworks_base/blob/60865e4a8dcefdf406f94d61121c4bcf13a8bcfb/core/java/android/view/LayoutInflater.java#L761

・・・

private static final String TAG_1995 = "blink";

・・・

View createViewFromTag(View parent, String name, Context context, AttributeSet attrs,
        boolean ignoreThemeAttr) {
    ・・・

    if (name.equals(TAG_1995)) {
        // Let's party like it's 1995!
        return new BlinkLayout(context, attrs);
    }

    ・・・
}

createViewFromTagはレイアウトファイル(XML)内のタグ名に応じてViewを生成する処理なので、
つまりこれは、かのblinkタグをAndroid上で実装してしまおうというお茶目な試み...
もちろんこんなタグはドキュメントのどこにも載っていない。

BlinkLayoutの実装はLayoutInflaterの一番下にprivate staticなクラスとしてしれっと定義されていて、
Handlerを使って500ms毎にちらちらさせるような実装になっている。

https://github.com/android/platform_frameworks_base/blob/60865e4a8dcefdf406f94d61121c4bcf13a8bcfb/core/java/android/view/LayoutInflater.java#L1039

FrameLayoutを継承しているので、適当にレイアウトファイルでblinkタグを書けば今すぐアプリに1995年の最高にクールなUIを導入できる。

<?xml version="1.0" encoding="utf-8"?>
<blink
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="30sp"
        android:textColor="#F00"
        android:text="Blink!!" />
</blink>

エミュレータでの様子

Let's party like it's 1995!