読者です 読者をやめる 読者になる 読者になる

2hours

1日2時間でなにができるかな

Android4.2 新機能Daydreamを試してみる

Android

Daydreamとは

Android4.2で追加されたスクリーンセーバー機能。


設定するには「設定」>「ディスプレイ」>「スクリーンセーバー」から。


しかしなんか時計がダサい気が・・・。


実装してみる

とりあえず時計がダサいので作ってみる。

AndroidManifest.xml

serviceとして追加する。

<service
    android:name=".MyDream" 
    android:exported="false" >
    <intent-filter>
        <action android:name="android.service.dreams.DreamService" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</service>
MyDream.java
public class MyDream extends DreamService {

    private TextView timeView;
    private TextView dateView;
    
    private SimpleDateFormat timeFormat;
    private SimpleDateFormat dateFormat;
    
    @Override
    public void onAttachedToWindow() {
        super.onAttachedToWindow();
        //Use this for initial setup, such as calling setContentView().

        // Exit dream upon user touch
        setInteractive(false);
        // Hide system UI
        setFullscreen(false);
        // Set the dream layout
        setContentView(R.layout.dream);

        timeView = (TextView)findViewById(R.id.time);
        dateView = (TextView)findViewById(R.id.date);
        
        timeFormat = new SimpleDateFormat("hh:mm");
        dateFormat = new SimpleDateFormat("yyyy/MM/dd(EEE)");
        
        showCurrentTime();
    }

    @Override
    public void onDreamingStarted() {
        super.onDreamingStarted();
        // Your dream has started, so you should begin animations or other behaviors here.

        IntentFilter filter = new IntentFilter();
        filter.addAction(Intent.ACTION_TIME_TICK);
        registerReceiver(receiver, filter);
    }

    @Override
    public void onDreamingStopped() {
        super.onDreamingStopped();
        // Use this to stop the things you started in onDreamingStarted().
        unregisterReceiver(receiver);
    }

    @Override
    public void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        // Use this to dismantle resources your dream set up. For example, detach from handlers and listeners.
    }
    
    private void showCurrentTime(){
        Date date = new Date();
        String dateStr = dateFormat.format(date);
        String timeStr = timeFormat.format(date);
        timeView.setText(timeStr);
        dateView.setText(dateStr);
    }
    
    private final BroadcastReceiver receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            showCurrentTime();
        }
    };
}


setInteractive
falseの場合は、タッチされた場合にスクリーンセーバーが終了する。

setFullscreen
falseの場合、ステータスバーが表示される。

layout/dream.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    <TextView
        android:id="@+id/time"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:textColor="#FFF"
        android:textSize="200sp" />
    <TextView
        android:id="@+id/date"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#FFF"
        android:textSize="50sp"
        android:layout_centerHorizontal="true"
        android:layout_below="@+id/time" />
</RelativeLayout>

適当に10分くらいで書いてこんな感じの時計スクリーンセーバーが出来ました。