ソフトバンク、『X06HT HTC Desire』発売開始

2010年4月27日より、ソフトバンクモバイル初となるAndroid搭載スマートフォン「HTC Desire SoftBank X06HT」が発売されました。

詳しくはhttp://www.htc.com/jp/product/x06ht/overview.html

MediaPlayer を使ってみた

android で mp3, midi などを再生するには
MediaPlayer を使います

そして drawable/raw を作ってその中にメディアファイルを格納します

その後, MediaPlayer.create(context, resid); で作成します

というわけで, MediaPlayer をいじってみた

サンプルプログラム
  1. import android.app.Activity;  
  2. import android.media.MediaPlayer;  
  3. import android.os.Bundle;  
  4. import android.view.View;  
  5. import android.view.View.OnClickListener;  
  6. import android.widget.Button;  
  7.   
  8. public class MediaPlayerTest extends Activity   
  9.                              implements OnClickListener {  
  10.   private MediaPlayer mediaPlayer = null;  
  11.   private Button button_Play;  
  12.   private Button button_Pause;  
  13.   private Button button_Stop;  
  14.   @Override  
  15.   public void onCreate(Bundle savedInstanceState) {  
  16.     super.onCreate(savedInstanceState);  
  17.     setContentView(R.layout.soundtest);  
  18.       
  19.     button_Play = (Button) findViewById(R.id.Button01);  
  20.     button_Play.setOnClickListener(this);  
  21.     button_Pause = (Button) findViewById(R.id.Button02);  
  22.     button_Pause.setOnClickListener(this);    
  23.     button_Stop = (Button) findViewById(R.id.Button03);  
  24.     button_Stop.setOnClickListener(this);    
  25.   
  26.     // メディアプレイヤーの作成  
  27.     mediaPlayer = MediaPlayer.create(this, R.raw.sample);  
  28.       
  29.     // ループ再生の設定  
  30.     // mediaPlayer.setLooping(true);  
  31.   }  
  32.   @Override  
  33.   public void onClick(View v) {  
  34.     if (v == button_Play) {  
  35.       // 再生してなかったら  
  36.       if (!mediaPlayer.isPlaying()) {  
  37.         // MediaPlayerの再生  
  38.         mediaPlayer.start();  
  39.       }  
  40.     } else if (v == button_Pause) {  
  41.       // MediaPlayerの一時停止  
  42.       mediaPlayer.pause();  
  43.     }  
  44.     else if (v == button_Stop) {  
  45.       // 再生してたら  
  46.       if (mediaPlayer.isPlaying()) {  
  47.         // MediaPlayerの停止  
  48.         mediaPlayer.stop();  
  49.         try {  
  50.           // MediaPlayerの準備  
  51.           mediaPlayer.prepare();  
  52.         } catch (Exception e) {}  
  53.       }  
  54.     }  
  55.   }  
  56. }  

こんな感じ!

参考サイト
http://developer.android.com/intl/ja/reference/android/media/MediaPlayer.html

ToneGenerator を使ってみた

ToneGeneratorを使うと簡単にトーンを鳴らせます
コンストラクタは
ToneGenerator (int streamType, int volume);
第1引数はストリームの種類
第2引数は音量

んで、
startTone(int ToneType) or startTone(int ToneType, int durationMs)
で再生します
後者は再生する時間を指定
Toneの種類に関してはToneGeneratorから

というわけで, ToneGenarator をいじってみた

サンプルプログラム
  1. import android.app.Activity;  
  2. import android.media.AudioManager;  
  3. import android.media.ToneGenerator;  
  4. import android.os.Bundle;  
  5. import android.view.View;  
  6. import android.view.View.OnClickListener;  
  7. import android.widget.Button;  
  8.   
  9. public class ToneGeneratorTest extends Activity {  
  10.   ToneGenerator toneGenerator;  
  11.   @Override  
  12.   public void onCreate(Bundle savedInstanceState) {  
  13.     super.onCreate(savedInstanceState);  
  14.     setContentView(R.layout.tonegeneratortest);  
  15.   
  16.     // ToneGenerator の作成  
  17.     toneGenerator = new ToneGenerator(  
  18.         AudioManager.STREAM_ALARM,  
  19.         ToneGenerator.MAX_VOLUME  
  20.     );  
  21.   
  22.     ((Button) findViewById(R.id.Button01))  
  23.     .setOnClickListener(new OnClickListener() {  
  24.       public void onClick(View v) {  
  25.         // Tone再生  
  26.         toneGenerator.startTone(ToneGenerator.TONE_CDMA_ABBR_ALERT);  
  27.         // toneGenarator.stratTone(ToneGenerator.TONE_CDMA_ABBR_ALERT, 1000);  
  28.       }  
  29.     });  
  30.     ((Button) findViewById(R.id.Button02))  
  31.     .setOnClickListener(new OnClickListener() {  
  32.       public void onClick(View v) {  
  33.         // Tone停止  
  34.         toneGenerator.stopTone();  
  35.       }  
  36.     });  
  37.   }  
  38.     
  39.   @Override  
  40.   public void onDestroy() {  
  41.     super.onDestroy();  
  42.       
  43.     // ToneGenerator の解放  
  44.     toneGenerator.release();  
  45.   }  
  46. }  

こんな感じ!

参考サイト
http://developer.android.com/intl/ja/reference/android/media/ToneGenerator.html
http://developer.android.com/intl/ja/reference/android/media/AudioManager.html

Tab を作ってみた

Tab を使うには TabHost と TabWidget を使います
そして TabWidget でTabのコンテンツを表示するのに FrameLayout を使います

Tabのコンテンツとして 任意のViewを表示させるのと, Activityを起動する2種類があるようです

というわけで, Tab を作ってみた

注意するのは id として
  • TabHost は @android:id/tabhost
  • TabWidget は @android:id/tabs
  • メインの FrameLayout は @android:id/tabcotent
というのを指定してあげます

XMLリソース
  1. <TabHost xmlns:android="http://schemas.android.com/apk/res/android"  
  2.   android:id="@android:id/tabhost"   
  3.   android:layout_width="fill_parent"  
  4.   android:layout_height="fill_parent">  
  5.   <LinearLayout   
  6.     android:orientation="vertical"  
  7.     android:layout_width="fill_parent"   
  8.     android:layout_height="fill_parent"  
  9.     android:padding="5dp">  
  10.     <TabWidget   
  11.       android:id="@android:id/tabs"  
  12.       ... />  
  13.     <FrameLayout   
  14.       android:id="@android:id/tabcontent"  
  15.       android:padding="5dp"  
  16.       ... >  
  17.       <LinearLayout  
  18.         android:id="@+id/content1"   
  19.         android:orientation="vertical"  
  20.         ... >  
  21.         <TextView   
  22.           ... />  
  23.       </LinearLayout>  
  24.       <LinearLayout  
  25.         android:id="@+id/content2"   
  26.             ・  
  27.             ・  
  28.             ・  
  29.       </LinearLayout>  
  30.     </FrameLayout>  
  31.   </LinearLayout>  
  32. </TabHost>  

また, Tab が切り替わったときのアイコンの切り替えもXMLで指定できます
以下のように作ってres/drawable に置きます
  1. <selector xmlns:android="http://schemas.android.com/apk/res/android">  
  2.   <!-- 選択されたときの画像 -->  
  3.   <item android:drawable="@android:drawable/star_big_on"  
  4.         android:state_selected="true" />  
  5.   <!-- 選択されていないときの画像 -->  
  6.   <item android:drawable="@android:drawable/star_big_off" />  
  7. </selector>  
んで, 本体
ここで Activity でなく TabActivity というのを継承させます

サンプルプログラム
  1. import android.app.TabActivity;  
  2. import android.graphics.Color;  
  3. import android.os.Bundle;  
  4. import android.view.Gravity;  
  5. import android.widget.TabHost;  
  6. import android.widget.TextView;  
  7. import android.widget.TabHost.OnTabChangeListener;  
  8.   
  9. public class TabTest extends TabActivity  
  10.                      implements OnTabChangeListener {  
  11.   private static final String TAG[] = {  
  12.     "tag1""tag2""tag3",  
  13.   };  
  14.   private static final String LABEL[] = {  
  15.     "Label1""Label2""Label3",  
  16.   };  
  17.   
  18.   TabHost tabHost;  
  19.   TabHost.TabSpec spec;  
  20.   TextView textView;  
  21.   
  22.   @Override  
  23.   public void onCreate(Bundle savedInstanceState) {  
  24.     super.onCreate(savedInstanceState);  
  25.   
  26.     setContentView(R.layout.tabtest);  
  27.     textView = new TextView(this);  
  28.       
  29.     // TabHost の取得  
  30.     tabHost = getTabHost();  
  31.     // Tab が切り替わったときに呼ばれるコールバックを登録  
  32.     tabHost.setOnTabChangedListener(this);  
  33.   
  34.     /********** Tab その1 **********/  
  35.     // TabSpec の作成  
  36.     spec = tabHost.newTabSpec(TAG[0]);  
  37.     // インジケーターの設定  
  38.     spec.setIndicator(LABEL[0]);  
  39.     // Tab のコンテンツの設定  
  40.     spec.setContent(R.id.content1);  
  41.     // TabHost に Tab を追加  
  42.     tabHost.addTab(spec);  
  43.   
  44.     /********** Tab その2 **********/  
  45.     spec = tabHost.newTabSpec(TAG[1])  
  46.     // アイコン付きインジケーターの設定  
  47.     .setIndicator(LABEL[1], getResources().getDrawable(R.drawable.icon))  
  48.     .setContent(R.id.content2);  
  49.     tabHost.addTab(spec);  
  50.   
  51.     textView.setText("Text");  
  52.     textView.setBackgroundColor(Color.DKGRAY);  
  53.     textView.setTextColor(Color.RED);  
  54.     textView.setGravity(Gravity.CENTER);  
  55.   
  56.     /********** Tab その3 **********/  
  57.     // 起動したいアクティビティのIntent作成  
  58.     Intent intent = new Intent().setClass(this, TabTest.class);  
  59.       
  60.     spec = tabHost.newTabSpec(TAG[2])  
  61.     // インジケーターに任意のビューを設定  
  62.     .setIndicator(textView)  
  63.     // Intent を設定  
  64.     .setContent(intent);  
  65.     tabHost.addTab(spec);  
  66.   
  67.     // 現在の Tab を設定  
  68.     tabHost.setCurrentTab(0);  
  69.   }  
  70.   // Tab が切り替わったときの動作 (引数はTag)  
  71.   public void onTabChanged(String tabId) {  
  72.     if (tabId == TAG[2])  
  73.       textView.setBackgroundColor(Color.LTGRAY);  
  74.     else  
  75.       textView.setBackgroundColor(Color.DKGRAY);  
  76.   }  
  77. }  
これでOK!

プログラムを実行すると...


こんな感じ!

今回は Intent で自分自身を読んでます
当たり前ですが何回も呼ぶとオーバーフローして落ちます

Tab で TabActivity を呼べば多段の Tab ができそう!

参考サイト
http://developer.android.com/intl/ja/resources/tutorials/views/hello-tabwidget.html
http://developer.android.com/intl/ja/reference/android/widget/TabHost.html
http://developer.android.com/intl/ja/reference/android/widget/TabWidget.html

HorizontalScrollView を使ってみた

横方向にスクロールさせるには
HorizontalScrollView を使います
java.lang.Object
  ↳ android.view.View
    ↳ android.view.ViewGroup
      ↳ android.widget.FrameLayout
        ↳ android.widget.HorizontalScrollView

その名の通り ScrollView の横バージョンです

HorizontalScrollView は ScrollView と同様一つしか子ビューを持てないので
LineaLayout などにまとめて入れてやります

というわけで, HorizontalScrollView をいじってみた

XMLリソース
  1. <HorizontalScrollView  
  2.   android:layout_width="fill_parent"  
  3.   android:layout_height="fill_parent"   
  4.   android:id="@+id/HorizontalScrollView">  
  5.   <LinearLayout   
  6.     android:id="@+id/LinearLayout"  
  7.     android:layout_width="wrap_content"   
  8.     android:layout_height="wrap_content">  
  9.     <TextView   
  10.       android:id="@+id/TextView"   
  11.       android:layout_width="wrap_content"  
  12.       android:layout_height="wrap_content"   
  13.       android:text="HorizontalScrollViewTest">  
  14.     </TextView>  
  15.         ・  
  16.         ・  
  17.         ・  
  18.   </LinearLayout>  
  19. </HorizontalScrollView>  
アクティビティー側で setContentView で設定

プログラムを実行すると...


こんな感じ!

一番下にスクロールバーが表示されています

参考サイト
http://developer.android.com/intl/ja/reference/android/widget/HorizontalScrollView.html

XML で Menu

Menu を XML で作成したいときは
/res に menu というフォルダを作成し、その中にxmlファイルを作成します


XML は以下のようにすればOKです
submenu を作りたいときは item の中に menu を入れてあげます。

XML リソース
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <menu xmlns:android="http://schemas.android.com/apk/res/android">  
  3.   <item   
  4.     android:id="@+id/menu_item01"   
  5.     android:title="Menu01"/>  
  6.   <group   
  7.     android:id="@+id/menu_group01">  
  8.     <item   
  9.       android:icon="@drawable/icon"   
  10.       android:id="@+id/menu_item02"   
  11.       android:title="Menu02"/>  
  12.   </group>  
  13.   <item   
  14.     android:id="@+id/menu_item03"   
  15.     android:title="Menu03">  
  16.     <menu>  
  17.       <item   
  18.         android:id="@+id/submenu_item01"   
  19.         android:title="Sub_Menu01"/>  
  20.       <item   
  21.         android:id="@+id/submenu_item02"   
  22.         android:title="Sub_Menu02/">  
  23.     </menu>  
  24.   </item>  
  25. </menu>  

そして,
MenuInflater というクラスを使ってXMLを取得します

サンプルプログラム
  1. import android.app.Activity;  
  2. import android.os.Bundle;  
  3. import android.view.Menu;  
  4. import android.view.MenuInflater;  
  5. import android.view.MenuItem;  
  6.   
  7. public class MenuXMLTest extends Activity {  
  8.   @Override  
  9.   public void onCreate(Bundle savedInstanceState) {  
  10.     super.onCreate(savedInstanceState);  
  11.     setContentView(R.layout.main);  
  12.   }  
  13.   
  14.   // Option Menu が最初に表示される時に1度だけ呼び出される  
  15.   @Override  
  16.   public boolean onCreateOptionsMenu(Menu menu) {  
  17.     super.onCreateOptionsMenu(menu);  
  18.     // MenuInflater の取得  
  19.     MenuInflater menuInflater = getMenuInflater();  
  20.     // MenuInflater から XML の取得    
  21.     menuInflater.inflate(R.menu.menutest, menu);  
  22.     return true;  
  23.   }  
  24. }  

あとは普通に onOptionsItemSelected(MenuItem item) などをオーバーライドすればアイテムが選択された際の処理などもできます

プログラムを実行すると...

こんな感じ!

参考サイト
http://developer.android.com/intl/ja/guide/topics/resources/available-resources.html#menus
http://developer.android.com/intl/ja/reference/android/view/MenuInflater.html

Eclipse で Xperia用アプリ開発準備

EclipseでXperia用のアプリを開発するためには、

まず、以下のソニーエリクソンのページ(http://developer.sonyericsson.com/wportal/devworld/downloads)
から, Android の部分にある [All Android Downloads] をクリックし
『Sony Ericsson Xperia X10 add-on for the Android SDK』というのをダウンロード

ダウンロードしたファイルを解凍して [Android SDK]を保存してあるディレクトリを開いて、その中にある [add-ons]ディレクトリの中に置く

そしたら、次は Eclipse を開く

普通のAVDの作成と同じで
[Window] -> [Android SDK and AVD Manager] 移動して [New] をクリック
すると [Target] に『X10 (Sony Erricsson ...』というのがあるのでそれを選択

Skin も『X10』を選択(たぶんデフォルトでなってる)



んで [Create AVD]

そして、プロジェクトの作成

Android 1.6 用のものがあるならわざわざ新しいのを作らなくても大丈夫

こちらも [Target Name] のところに『X10』が現れるので選択



これでOK!

そして、[Run Configurations] で Tagetをさっき作った『X10』のAVDを選んで実行すると...


こんな感じ!

やっぱ Xperia かっこいいですね!

XML で Animation

Animation を XML で作成したいときは

/res に anim というフォルダを作成し、その中にxmlファイルを作成します

アニメーションの要素としては以下のようなものがあります
  • set
  • alpha
  • scale
  • translate
  • rotate
  • interpolator

サイズを指定するものでViewサイズに対する比率を指定できるわけですが
以下の2種類で指定します
%   : View のサイズに対する比率
%p  : 親View のサイズに対する比率

というわけで、アニメーションを作ってみた

下からズームインしてくるアニメーション
zoom_in_from_bottom.xml
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <set xmlns:android="http://schemas.android.com/apk/res/android">  
  3.   <scale  
  4.     android:fromXScale="0.0"  
  5.     android:toXScale="1.0"  
  6.     android:fromYScale="0.0"  
  7.     android:toYScale="1.0"  
  8.     android:pivotX="50%"  
  9.     android:duration="1000">  
  10.   </scale>  
  11.   <translate  
  12.     android:fromYDelta="100%p"  
  13.     android:toYDelta="0.0"  
  14.     android:duration="1000">  
  15.   </translate>  
  16. </set>  

こんな感じで作成します

作成したら
AnimationUtilsクラスの
loadAnimation(context, id) メソッドを使ってアニメーションを取得

例えば
AnimationUtils.loadAnimation(context, R.anim.zoom_in_from_bottom);
というふうにすれば取得できます!


参考サイト
http://developer.android.com/intl/ja/guide/topics/resources/available-resources.html#animation
http://developer.android.com/intl/ja/reference/android/view/animation/AnimationUtils.html

XML でカスタムView

既存の View を拡張して新たに自分だけの View を作成したいときは

まず、res/values に attrs.xml を作成します

attrs.xml
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <resources>  
  3.  <!-- name : custom view class name -->  
  4.   <declare-styleable name="CustomView">  
  5.     <attr name="text" format="string" />  
  6.     <attr name="color" format="color" />  
  7.     <attr name="size" format="dimension" />  
  8.   </declare-styleable>  
  9. </resources>  

declare-styleable の name属性は作成するカスタムビューのクラス名を指定する

次に、レイアウトを作成します

xmlns:app="http://schemas.android.com/apk/res/パッケージの名前"
というのを追加します
app は勝手につけた名前

attrs.xml で作成した属性を指定します

XMLリソース
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout  
  3.   xmlns:android="http://schemas.android.com/apk/res/android"  
  4.   xmlns:app="http://schemas.android.com/apk/res/androidtest.app"  
  5.   android:id="@+id/LinearLayout"  
  6.   android:layout_height="fill_parent"  
  7.   android:layout_width="fill_parent">   
  8.   <androidtest.app.CustomView  
  9.     android:id="@+id/CustomView"   
  10.     android:layout_height="fill_parent"  
  11.     android:layout_width="fill_parent"   
  12.     app:text="CustomViewTest"   
  13.     app:color="#FFFF0000"  
  14.     app:size="32sp" />  
  15. </LinearLayout>  

そしたら、カスタムビューの作成

サンプルプログラム(CustomView)
  1. import android.content.Context;  
  2. import android.content.res.TypedArray;  
  3. import android.graphics.Canvas;  
  4. import android.graphics.Paint;  
  5. import android.util.AttributeSet;  
  6. import android.view.View;  
  7. import androidtest.app.R;  
  8.   
  9. public class CustomView extends View {  
  10.   String str;  
  11.   int color;  
  12.   int size;  
  13.   
  14.   public CustomView(Context context, AttributeSet attrs) {  
  15.     super(context, attrs);  
  16.   
  17.     // styleable から TypedArray の取得  
  18.     TypedArray tArray =   
  19.       context.obtainStyledAttributes(  
  20.         attrs,  
  21.         R.styleable.CustomView  
  22.       );  
  23.     
  24.     // TypedArray から String を取得  
  25.     str = tArray.getString(R.styleable.CustomView_text);  
  26.     // TypedArray から Color を取得  
  27.     color = tArray.getColor(R.styleable.CustomView_color, 0xFFFFFFFF);  
  28.     // TypedArray から Dimension を取得  
  29.     size = tArray.getDimensionPixelSize(R.styleable.CustomView_size, 12);  
  30.   }  
  31.   
  32.   @Override  
  33.   protected void onDraw(Canvas canvas) {  
  34.     super.onDraw(canvas);  
  35.     Paint paint = new Paint();  
  36.     paint.setColor(color);  
  37.     paint.setTextSize(size);  
  38.     canvas.drawText(str, 3264, paint);  
  39.   }  
  40. }  

Activity では setContentView で作成した layout を指定するだけ

サンプルプログラム(Activity)
  1. import android.app.Activity;  
  2. import android.os.Bundle;  
  3. import androidtest.app.R;  
  4.   
  5. public class CustomViewTest extends Activity {  
  6.   @Override  
  7.   public void onCreate(Bundle savedInstanceState) {  
  8.     super.onCreate(savedInstanceState);  
  9.     setContentView(R.layout.customviewtest);  
  10.   }  
  11. }  

プログラムを実行すると...


こんな感じ!


参考サイト
http://developer.android.com/intl/ja/guide/topics/resources/available-resources.html#customresources

ToggleButton を使ってみた

ToggleButton は
java.lang.Object
  ↳ android.view.View
    ↳ android.widget.TextView
      ↳ android.widget.Button
        ↳ android.widget.CompoundButton
          ↳ android.widget.ToggleButton
を使います

というわけで、ToggleButton を使ってみた

サンプルプログラム
  1. import android.app.Activity;  
  2. import android.os.Bundle;  
  3. import android.util.Log;  
  4. import android.widget.TextView;  
  5. import android.widget.ToggleButton;  
  6.   
  7. public class ToggleButtonTest extends Activity {  
  8.   ToggleButton toggleButton;  
  9.   @Override  
  10.   public void onCreate(Bundle savedInstanceState) {  
  11.     super.onCreate(savedInstanceState);  
  12.     setContentView(R.layout.togglebuttontest);  
  13.     
  14.     toggleButton = (ToggleButton) findViewById(R.id.ToggleButton01);  
  15.     
  16.     // ToggleButton が On のときのテキストを設定  
  17.     toggleButton.setTextOn("Toggle ON");  
  18.     // ToggleButton が Off のときのテキストを設定  
  19.     toggleButton.setTextOff("Toggle OFF");  
  20.     
  21.     // ToggleButton が On かどうかを設定  
  22.     toggleButton.setChecked(true);  
  23.     
  24.     // ToggleButton が On かどうかを取得  
  25.     boolean checked = toggleButton.isChecked();   
  26.   }  
  27. }  

XMLリソースで設定もできます

XMLリソース
  1. <ToggleButton  
  2.   android:id="@+id/ToggleButton"  
  3.   android:layout_height="wrap_content"  
  4.   android:layout_width="wrap_content"  
  5.   android:textOff="Toggle Off"  
  6.   android:textOn="Toggle On">  
  7. </ToggleButton>  

プログラムを実行すると...



こんな感じ!

参考サイト
http://developer.android.com/intl/ja/reference/android/widget/ToggleButton.html

いろいろな AlertDialog

AlertDialog.Builderクラスを使っていろいろな AlertDialog を作ってみた

サンプルプログラム
  1. import android.app.Activity;  
  2. import android.app.AlertDialog;  
  3. import android.content.DialogInterface;  
  4. import android.content.DialogInterface.OnClickListener;  
  5. import android.content.DialogInterface.OnMultiChoiceClickListener;  
  6. import android.os.Bundle;  
  7. import android.view.View;  
  8. import android.widget.Button;  
  9. import android.widget.EditText;  
  10.   
  11. public class AlertDialogTest2 extends Activity implements View.OnClickListener {  
  12.   AlertDialog.Builder alertDialogBuilder;  
  13.   Button button[];  
  14.   
  15.   @Override  
  16.   public void onCreate(Bundle savedInstanceState) {  
  17.     super.onCreate(savedInstanceState);  
  18.     setContentView(R.layout.alertdialogtest2);  
  19.   
  20.     button = new Button[3];  
  21.     for (int i = 0; i < 3; i++) { d.Button01 + i);  
  22.       button[i].setOnClickListener(this);  
  23.     }  
  24.   }  
  25.   
  26.   public void onClick(View v) {  
  27.     if (v == button[0]) {  
  28.       setEditAlertDialog();  
  29.     } else if (v == button[1]) {  
  30.       setSingleChoiceDialog();  
  31.     } else if (v == button[2]) {  
  32.        setMultiChoiceDialog();  
  33.     }  
  34.   }  
  35.   
  36.   /* AlertDialog(EditText) */  
  37.   public void setEditAlertDialog() {  
  38.     EditText editText = new EditText(this);  
  39.     editText.setText("Please fill your name!");  
  40.   
  41.     alertDialogBuilder = new AlertDialog.Builder(this);  
  42.     alertDialogBuilder.setTitle("EditTextDialog");  
  43.   
  44.     // AlertDialog に View を設定  
  45.     alertDialogBuilder.setView(editText);  
  46.   
  47.     // Positive Button を設定  
  48.     alertDialogBuilder.setPositiveButton(  
  49.       "Positive",   
  50.       new DialogInterface.OnClickListener() {  
  51.         public void onClick(DialogInterface dialog, int which) {  
  52.           // Positive Button がクリックされた時の動作  
  53.         }  
  54.       }  
  55.     );  
  56.     alertDialogBuilder.show();  
  57.   }  
  58.    
  59.   /* SingleChoiceDialog */  
  60.   public void setSingleChoiceDialog() {  
  61.     // 表示させるアイテム名  
  62.     final String[] str_items = {  
  63.       "One",  
  64.       "Two",  
  65.       "Three"  
  66.     };  
  67.   
  68.     alertDialogBuilder = new AlertDialog.Builder(this);  
  69.     alertDialogBuilder.setTitle("SingleChoiceDialog");  
  70.   
  71.     // 初めに選ばれているアイテム  
  72.     final int default_item = 0;  
  73.   
  74.     // SingleChoiceDialog の作成  
  75.     alertDialogBuilder.setSingleChoiceItems(  
  76.       str_items,   
  77.       default_item,  
  78.       new OnClickListener() {  
  79.         public void onClick(DialogInterface dialog, int which) {  
  80.           // アイテムが選ばれたときの動作  
  81.         }  
  82.       }  
  83.     );  
  84.     // Positive Button を設定  
  85.     alertDialogBuilder.setPositiveButton(  
  86.       "Positive",   
  87.       new DialogInterface.OnClickListener() {  
  88.         public void onClick(DialogInterface dialog, int which) {  
  89.           // Positive Button がクリックされた時の動作  
  90.         }  
  91.       }  
  92.     );  
  93.     alertDialogBuilder.show();  
  94.   }  
  95.   
  96.   /* MultiChoiceDialog */  
  97.   public void setMultiChoiceDialog() {  
  98.     // 表示させるアイテム名  
  99.     final String[] str_items = {  
  100.       "Red",  
  101.       "Green",  
  102.       "Blue"  
  103.     };  
  104.     // 各アイテムがチェックされている状態かどうか  
  105.     final boolean[] flag_items = {  
  106.       false,  
  107.       true,  
  108.       false  
  109.     };  
  110.   
  111.     alertDialogBuilder = new AlertDialog.Builder(this);  
  112.     alertDialogBuilder.setTitle("MultiChoiceDialog");  
  113.   
  114.     // MultiChoiceDialog の作成  
  115.     alertDialogBuilder.setMultiChoiceItems(  
  116.       str_items,   
  117.       flag_items,  
  118.       new OnMultiChoiceClickListener() {  
  119.         public void onClick(  
  120.             DialogInterface dialog,   
  121.             int which,   
  122.             boolean isChecked) {  
  123.           // アイテムが選ばれたときの動作  
  124.         }  
  125.       }  
  126.     );  
  127.     // Positive Button を設定  
  128.     alertDialogBuilder.setPositiveButton(  
  129.       "Positive",   
  130.       new DialogInterface.OnClickListener() {  
  131.         public void onClick(DialogInterface dialog, int which) {  
  132.           // Positive Button がクリックされた時の動作  
  133.         }  
  134.       }  
  135.     );  
  136.     alertDialogBuilder.show();  
  137.   }  
  138. }  
プログラムを実行すると...

AlertDialog(EditText)

SingleChoiceDialog

MultiChoiceDialog

こんな感じ!


参考サイト
http://developer.android.com/intl/ja/reference/android/app/AlertDialog.html
http://developer.android.com/intl/ja/reference/android/app/AlertDialog.Builder.html

Spannable で文字のマークアップ

Spannable はテキストをマークアップするためのインターフェースです

CharacterStyleなどのクラスを使って文字列の一部を
下線を引いたり、下付き文字にしたり、
上付き文字にしたり、URLを付けたり...
と様々なことができます

CharacterStyle のサブクラスには
  • UnderlineSpan
  • SubscriptSpan
  • SuperscriptSpan
  • URLSpan
  • ScaleXSpan
  • RelativeSizeSpan
  • etc...
といろいろあります

というわけで, Spannable でテキストをいじってみた

サンプルプログラム
  1. import android.app.Activity;  
  2. import android.os.Bundle;  
  3. import android.text.Spannable;  
  4. import android.text.Spannable.Factory;  
  5. import android.text.style.RelativeSizeSpan;  
  6. import android.text.style.ScaleXSpan;  
  7. import android.text.style.SubscriptSpan;  
  8. import android.text.style.SuperscriptSpan;  
  9. import android.text.style.URLSpan;  
  10. import android.text.style.UnderlineSpan;  
  11. import android.view.View;  
  12. import android.view.View.OnClickListener;  
  13. import android.widget.TextView;  
  14.   
  15. public class SpannableTest extends Activity {  
  16.   Spannable spannable;  
  17.   
  18.   UnderlineSpan underline;  
  19.   SubscriptSpan subscript;  
  20.   SuperscriptSpan superscript;  
  21.   URLSpan url;  
  22.   ScaleXSpan scaleX;  
  23.   RelativeSizeSpan relative;  
  24.   
  25.   TextView textView[];  
  26.   
  27.   @Override  
  28.   public void onCreate(Bundle savedInstanceState) {  
  29.     super.onCreate(savedInstanceState);  
  30.     setContentView(R.layout.spannabletest);  
  31.   
  32.     textView = new TextView[4];  
  33.     for (int i = 0; i < 4; i++) {  
  34.       textView[i] = (TextView) findViewById(R.id.TextView01 + i);  
  35.     }  
  36.   
  37.     // UnderlineSpan  
  38.     underline = new UnderlineSpan();  
  39.     // SubscriptSpan  
  40.     subscript = new SubscriptSpan();  
  41.     // SuperscriptSpan  
  42.     superscript = new SuperscriptSpan();  
  43.     // URLSpan  
  44.     url = new URLSpan("http://weide-dev.blogspot.com/");  
  45.     // ScaleXSpan  
  46.     scaleX = new ScaleXSpan(0.5f);  
  47.     // RelativeSizeSpan  
  48.     relative = new RelativeSizeSpan(0.5f);  
  49.   
  50.     // Factory の取得  
  51.     Factory factory = Spannable.Factory.getInstance();  
  52.   
  53.     /* アンダーラインが引かれた文字列 */  
  54.     // Spannable の取得  
  55.     spannable = factory.newSpannable(textView[0].getText());  
  56.     // 0からテキストの長さ分まで下線を引く  
  57.     spannable.setSpan(  
  58.         underline,  
  59.         0,  
  60.         textView[0].getText().length(),  
  61.         spannable.getSpanFlags(underline)  
  62.     );  
  63.     // TextView にテキストを設定  
  64.     textView[0].setText(spannable, TextView.BufferType.SPANNABLE);  
  65.   
  66.     /* 後ろ4文字が下付きの文字列 */  
  67.     spannable = factory.newSpannable(textView[1].getText());  
  68.     // 後ろ4文字を下付き文字にする  
  69.     spannable.setSpan(  
  70.         subscript,  
  71.         textView[1].getText().length() - 4,  
  72.         textView[1].getText().length(),  
  73.         spannable.getSpanFlags(subscript)  
  74.     );  
  75.     // 後ろ4文字のXのスケールを0.5倍する  
  76.     spannable.setSpan(  
  77.         scaleX,  
  78.         textView[1].getText().length() - 4,  
  79.         textView[1].getText().length(),  
  80.         spannable.getSpanFlags(scaleX)  
  81.     );  
  82.     textView[1].setText(spannable, TextView.BufferType.SPANNABLE);  
  83.   
  84.     /* 後ろ4文字が上付きの文字列 */  
  85.     spannable = factory.newSpannable(textView[2].getText());  
  86.     // 後ろ4文字を上付き文字にする  
  87.     spannable.setSpan(  
  88.         superscript,  
  89.         textView[2].getText().length() - 4,  
  90.         textView[2].getText().length(),  
  91.         spannable.getSpanFlags(superscript)  
  92.     );  
  93.     // 後ろ4文字のサイズを0.5倍する  
  94.     spannable.setSpan(  
  95.         relative,  
  96.         textView[2].getText().length() - 4,  
  97.         textView[2].getText().length(),  
  98.         spannable.getSpanFlags(relative)  
  99.     );  
  100.     textView[2].setText(spannable, TextView.BufferType.SPANNABLE);  
  101.   
  102.     /* URL文字列 */  
  103.     spannable = factory.newSpannable(textView[3].getText());  
  104.     // 0からテキストの長さ分までURLタイプにする  
  105.     spannable.setSpan(  
  106.         url,  
  107.         0,  
  108.         textView[3].getText().length(),  
  109.         spannable.getSpanFlags(url)  
  110.     );  
  111.     textView[3].setText(spannable, TextView.BufferType.SPANNABLE);  
  112.     textView[3].setOnClickListener(new OnClickListener() {  
  113.       public void onClick(View v) {  
  114.         // URLを開く  
  115.         url.onClick(textView[3]);  
  116.       }  
  117.     });  
  118.   }  
  119. }  
プログラムを実行すると...


こんな感じ!


参考サイト
http://developer.android.com/intl/ja/reference/android/text/Spannable.html
http://developer.android.com/intl/ja/reference/android/text/style/CharacterStyle.html

Menu を使ってみた

Menu は
android.view.Menu
を使用します

さらに、Activity クラスの
  • public boolean onCreateOptionsMenu(Menu menu)
  • public boolean onPrepareOptionsMenu(Menu menu)
  • public boolean onOptionsItemSelected(MenuItem item)
  • public boolean onMenuOpened(int featureId, Menu menu)
などのメソッドを Override することで使用できます

というわけで、Menu をいじってみた

サンプルプログラム
  1. import android.app.Activity;  
  2. import android.os.Bundle;  
  3. import android.view.Menu;  
  4. import android.view.MenuItem;  
  5. import android.view.SubMenu;  
  6. import android.view.View;  
  7. import android.view.View.OnClickListener;  
  8. import android.widget.Button;  
  9.   
  10. public class MenuTest extends Activity {  
  11.   private static final int MENU_ID1 = Menu.FIRST;  
  12.   private static final int MENU_ID2 = Menu.FIRST + 1;  
  13.   private static final int MENU_ID3 = Menu.FIRST + 2;  
  14.   private static final int SUBMENU_ID1 = Menu.FIRST + 21;  
  15.   private static final int SUBMENU_ID2 = Menu.FIRST + 22;  
  16.   
  17.   @Override  
  18.   public void onCreate(Bundle savedInstanceState) {  
  19.     super.onCreate(savedInstanceState);  
  20.     setContentView(R.layout.main);   
  21.     
  22.     ((Button) findViewById(R.id.Button)).setOnClickListener(  
  23.       new OnClickListener() {  
  24.         public void onClick(View v) {  
  25.           // Menu の表示  
  26.           openOptionsMenu();  
  27.         }  
  28.       }  
  29.     );  
  30.   }  
  31.   
  32.   // Option Menu が最初に表示される時に1度だけ呼び出される  
  33.   @Override  
  34.   public boolean onCreateOptionsMenu(Menu menu) {  
  35.     boolean ret = super.onCreateOptionsMenu(menu);  
  36.   
  37.     // Menu にアイテムを追加  
  38.     menu.add(Menu.NONE, MENU_ID1, Menu.NONE, "Menu1");  
  39.     // Menu に Icon 付きアイテムを追加  
  40.     menu.add(Menu.NONE, MENU_ID2, Menu.NONE, "Menu2").setIcon(R.drawable.icon);  
  41.   
  42.     // SubMenu を追加  
  43.     SubMenu sMenu = menu.addSubMenu(Menu.NONE, MENU_ID3, 3"Menu3");  
  44.     sMenu.add(Menu.NONE, SUBMENU_ID1, Menu.NONE, "SubMenu1");  
  45.     sMenu.add(Menu.NONE, SUBMENU_ID2, Menu.NONE, "SubMenu2");  
  46.   
  47.     // Menu にショートカットキーを設定  
  48.     menu.findItem(MENU_ID1).setAlphabeticShortcut('a');  
  49.     menu.findItem(MENU_ID2).setAlphabeticShortcut('1');  
  50.     menu.findItem(MENU_ID3).setAlphabeticShortcut('s');  
  51.   
  52.     return ret;  
  53.   }  
  54.   
  55.   // Option Menu が表示される時の動作  
  56.   @Override  
  57.   public boolean onPrepareOptionsMenu(Menu menu) {  
  58.     return super.onPrepareOptionsMenu(menu);  
  59.   }  
  60.   
  61.   // Option Menu のアイテムが選択された時の動作  
  62.   @Override  
  63.   public boolean onOptionsItemSelected(MenuItem item) {  
  64.     boolean ret = super.onOptionsItemSelected(item);  
  65.     // 選ばれたアイテムの ID を取得  
  66.     switch(item.getItemId()) {  
  67.     case MENU_ID1:   // Menu1  
  68.       return true;  
  69.     case MENU_ID2:   // Menu2  
  70.       return true;  
  71.     case SUBMENU_ID1:   // Submenu1  
  72.       return true;  
  73.     default:  
  74.     }  
  75.     return ret;  
  76.   }  
  77.   
  78.   // Option Menu が開かれた時の動作  
  79.   @Override  
  80.   public boolean onMenuOpened(int featureId, Menu menu) {  
  81.     return super.onMenuOpened(featureId, menu);  
  82.   }  
  83. }  

プログラムを実行すると...


SubMenu は...

こんな感じ!

参考サイト
http://developer.android.com/intl/ja/reference/android/view/Menu.html
http://developer.android.com/intl/ja/reference/android/app/Activity.html

EditText を使ってみた

EditText は
java.lang.Object
   ↳ android.view.View
     ↳ android.widget.TextView
       ↳ android.widget.EditText
を使います

というわけで, EditText を使ってみた

サンプルプログラム
  1. import android.app.Activity;  
  2. import android.os.Bundle;  
  3. import android.text.InputType;  
  4. import android.widget.EditText;  
  5.   
  6. public class EditTextTest extends Activity {  
  7.   EditText editText;  
  8.    
  9.   @Override  
  10.   public void onCreate(Bundle savedInstanceState) {  
  11.     super.onCreate(savedInstanceState);  
  12.     setContentView(R.layout.edittexttest);  
  13.     
  14.     editText = (EditText) findViewById(R.id.EditText01);  
  15.     
  16.     // EditText にテキストを設定  
  17.     editText.setText("EditTextTest");  
  18.     
  19.     // EditText のインプットタイプを設定  
  20.     editText.setInputType(InputType.TYPE_CLASS_TEXT);  
  21.     
  22.     // EditText の最大行の設定  
  23.     editText.setMaxLines(1);  
  24.     
  25.     // EditText が空のときに表示させるヒントを設定  
  26.     editText.setHint("This is Hint");  
  27.     
  28.     // EditText のカーソル位置を設定  
  29.     editText.setSelection(3);  
  30.     // EditText のテキストを全選択  
  31.     // editText.selectAll();  
  32.     
  33.     // EditText のテキストを取得  
  34.     String str = editText.getText().toString();  
  35.   }  
  36. }  

InputType には
  • 数字入力
  • アドレス入力
  • パスワード入力
  • オートコンプリート
  • 入力不可
  • etc...
といろいろあります
詳しくは InputTypeクラス を参照してください

XMLリソースで指定することもできます

XMLリソース
  1. <EditText   
  2.   android:hint="This is Hint"  
  3.   android:id="@+id/EditText"   
  4.   android:inputType="text"   
  5.   android:layout_height="wrap_content"   
  6.   android:layout_width="wrap_content"    
  7.   android:text="EditTextTest">  
  8. </EditText>  

XMLリソースで
InputTypeを指定するときは android:InputType を使います

プログラムを実行すると...



こんな感じ!

また、ヒントは


こんな感じで表示されます!

参考サイト
http://developer.android.com/intl/ja/reference/android/widget/EditText.html

ScrollView を使ってみた

ScrollView を使うには
java.lang.Object
  ↳ android.view.View
    ↳ android.view.ViewGroup
      ↳ android.widget.FrameLayout
        ↳ android.widget.ScrollView
を使います

というわけで、ScrollView をいじってみた

サンプルプログラム
  1. import android.app.Activity;  
  2. import android.os.Bundle;  
  3. import android.widget.Button;  
  4. import android.widget.LinearLayout;  
  5. import android.widget.ScrollView;  
  6.   
  7. public class ScrollViewTest extends Activity {  
  8.   ScrollView scrollView;  
  9.   LinearLayout linearLayout;  
  10.   
  11.   @Override  
  12.   public void onCreate(Bundle savedInstanceState) {  
  13.     super.onCreate(savedInstanceState);  
  14.     scrollView = new ScrollView(this);  
  15.     linearLayout = new LinearLayout(this);  
  16.     linearLayout.setOrientation(LinearLayout.VERTICAL);  
  17.     
  18.     for (int i = 0; i < 12; i++) {  
  19.       Button button = new Button(this);  
  20.       button.setText("Button" + (i+1));  
  21.       linearLayout.addView(button);  
  22.     }  
  23.   
  24.     // ScrollView に View を追加  
  25.     scrollView.addView(linearLayout);  
  26.   
  27.     setContentView(scrollView);  
  28.   }  
  29. }  

ScrollView は1つしか View を設定できないので LinearLayout などにまとめる必要があります XMLでまとめて設定することもできます XMLリソース
  1. <ScrollView  
  2.   android:id="@+id/ScrollView"  
  3.   android:layout_height="fill_parent"  
  4.   android:layout_width="fill_parent">  
  5.   <LinearLayout   
  6.     android:id="@+id/LinearLayout"  
  7.     android:orientation="vertical"  
  8.     android:layout_height="fill_parent"  
  9.     android:layout_width="fill_parent">  
  10.     <!-- 追加したいView -->  
  11.     <Button .../>  
  12.         ・  
  13.         ・  
  14.         ・  
  15.   </LinearLayout>  
  16. </ScrollView>  

プログラムを実行すると...



こんな感じ!

右にスクロールバーが表示されて、上下に続きがあると少し暗くなっています

参考サイト
http://developer.android.com/intl/ja/reference/android/widget/ScrollView.html

SurfaceView を使ってみた

SurfaceView は
java.lang.Object
  ↳ android.view.View
    ↳ android.view.SurfaceView
を使用します

また、Surfaceの変更などを取得するために
SurfaceHolder.Callback
を使用します
このインターフェースは
  • public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
  • public void surfaceCreated(SurfaceHolder holder)
  • public void surfaceDestroyed(SurfaceHolder holder)
の3つのメソッドを実装する必要があります

というわけで、SurfaceView をいじってみた

サンプルプログラム
  1. import android.app.Activity;  
  2. import android.content.Context;  
  3. import android.graphics.BitmapFactory;  
  4. import android.graphics.Canvas;  
  5. import android.graphics.Color;  
  6. import android.graphics.Paint;  
  7. import android.graphics.drawable.BitmapDrawable;  
  8. import android.os.Bundle;  
  9. import android.view.SurfaceHolder;  
  10. import android.view.SurfaceView;  
  11.   
  12. public class SurfaceViewTest extends Activity {  
  13.   @Override  
  14.   public void onCreate(Bundle savedInstanceState) {  
  15.     super.onCreate(savedInstanceState);  
  16.   
  17.     setContentView(new SurfaceTestView(this));  
  18.   }  
  19.    
  20.   class SurfaceTestView extends SurfaceView   
  21.         implements SurfaceHolder.Callback, Runnable {  
  22.     private Thread thread;  
  23.     private BitmapDrawable bitmapDrawable;  
  24.     
  25.     public SurfaceTestView(Context context) {  
  26.       super(context);  
  27.      
  28.       // SurfaceHolder の取得  
  29.       SurfaceHolder holder = getHolder();  
  30.      
  31.       // SurfaceHolder に コールバックを設定  
  32.       holder.addCallback(this);  
  33.       holder.setFixedSize(getWidth(), getHeight());  
  34.      
  35.       // フォーカスをあてる  
  36.       setFocusable(true);  
  37.      
  38.       bitmapDrawable = new BitmapDrawable(  
  39.         context.getResources(),  
  40.         BitmapFactory.decodeResource(  
  41.           context.getResources(),   
  42.           R.drawable.icon)  
  43.       );  
  44.     }  
  45.   
  46.     // Surface が変更されたときの動作  
  47.     public void surfaceChanged(SurfaceHolder holder,  
  48.         int format, int width, int height) {  
  49.     }  
  50.   
  51.     // Surface が作成されたときの動作  
  52.     public void surfaceCreated(SurfaceHolder holder) {  
  53.       thread = new Thread(this);  
  54.       thread.start();  
  55.     }  
  56.   
  57.     // Surface が削除されたときの動作  
  58.     public void surfaceDestroyed(SurfaceHolder holder) {  
  59.       thread = null;  
  60.     }  
  61.   
  62.     public void run() {  
  63.       while (thread != null) {  
  64.         // 描画の開始  
  65.         Canvas canvas = getHolder().lockCanvas();  
  66.       
  67.         draw(canvas);  
  68.       
  69.         // 描画の終了  
  70.         getHolder().unlockCanvasAndPost(canvas);  
  71.       }  
  72.     }  
  73.   
  74.     @Override  
  75.     public void draw(Canvas canvas) {  
  76.       // 現在の状態を保存  
  77.       canvas.save();  
  78.      
  79.       Paint paint = new Paint();  
  80.       paint.setColor(Color.RED);  
  81.       paint.setTextSize(32);  
  82.      
  83.       bitmapDrawable.setBounds(009696);  
  84.       bitmapDrawable.draw(canvas);  
  85.       canvas.drawText("SurfaceViewTest"0128, paint);  
  86.   
  87.       paint.setAntiAlias(true);  
  88.       bitmapDrawable.setBounds(016096256);  
  89.       bitmapDrawable.draw(canvas);  
  90.       canvas.drawText("SurfaceViewTest2"0288, paint);  
  91.   
  92.       // 現在の状態の変更  
  93.       canvas.restore();  
  94.     }  
  95.   }  
  96. }  

プログラムを実行すると...


こんな感じ!(上:アンチエイリアスなし, 下:あり)

アンチエイリアスは時間がかかるが場合によってはかけた方が良さそう

参考サイト
http://developer.android.com/intl/ja/reference/android/view/SurfaceView.html
http://developer.android.com/intl/ja/reference/android/view/SurfaceHolder.Callback.html

Drawable を使ってみた

Drawableクラスは abstract class で
サブクラスには
  • BitmapDrawable
  • ColorDrawable
  • RotateDrawable
  • ScaleDrawable
  • etc...
といろいろあります

今回は BitmapDrawable クラスを使ってみた

BitmapDrawable は
java.lang.Object
  ↳ android.graphics.drawable.Drawable
    ↳ android.graphics.drawable.BitmapDrawable
を使用します

というわけで BitmapDrawable をいじってみた

サンプルプログラム
  1. import android.app.Activity;  
  2. import android.content.Context;  
  3. import android.graphics.BitmapFactory;  
  4. import android.graphics.Canvas;  
  5. import android.graphics.drawable.BitmapDrawable;  
  6. import android.os.Bundle;  
  7. import android.view.Gravity;  
  8. import android.view.View;  
  9.   
  10. public class DrawableTest extends Activity {  
  11.   BitmapDrawable bitmapDrawable;  
  12.   @Override  
  13.   public void onCreate(Bundle savedInstanceState) {  
  14.     super.onCreate(savedInstanceState);  
  15.     setContentView(new DrawableTestView(this));  
  16.   }  
  17.   
  18.   class DrawableTestView extends View {  
  19.     public DrawableTestView(Context context) {  
  20.       super(context);  
  21.       // BitmapDrawable を作成  
  22.       bitmapDrawable = (BitmapDrawable) context.getResources().getDrawable(R.drawable.icon);  
  23.     }  
  24.     @Override  
  25.     public void onDraw(Canvas canvas) {  
  26.       // BitmapDrawable の範囲を設定  
  27.       bitmapDrawable.setBounds(004848);  
  28.       // BitmapDrawable の描画  
  29.       bitmapDrawable.draw(canvas);  
  30.      
  31.       // BitmapDrawable のアルファ値を設定  
  32.       bitmapDrawable.setAlpha(128);  
  33.       bitmapDrawable.setBounds(4809648);  
  34.       bitmapDrawable.draw(canvas);  
  35.       bitmapDrawable.setAlpha(255);     
  36.   
  37.       // BitmapDrawable にアンチエイリアスを設定  
  38.       bitmapDrawable.setAntiAlias(true);  
  39.       bitmapDrawable.setBounds(048240288);  
  40.       bitmapDrawable.draw(canvas);  
  41.      
  42.       bitmapDrawable.setAntiAlias(false);  
  43.       bitmapDrawable.setBounds(24048480288);  
  44.       bitmapDrawable.draw(canvas);  
  45.      
  46.       bitmapDrawable.setBounds(00, getWidth(), getHeight());  
  47.       // BitmapDrawable にグラビティを設定  
  48.       bitmapDrawable.setGravity(Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM);  
  49.       bitmapDrawable.draw(canvas);  
  50.     }  
  51.   }  
  52. }  

プログラムを実行してみると...


こんな感じ!(左:アンチエイリアスあり, 右:なし)

この画像だとアンチエイリアスの違いはよく分からないですね
状況によって使い分けるのが良さそう

参考サイト
http://developer.android.com/intl/ja/reference/android/graphics/drawable/Drawable.html
http://developer.android.com/intl/ja/reference/android/graphics/drawable/BitmapDrawable.html

Bitmap で Pixel 操作してみた

Bitmap をピクセル単位で操作するには

getPixel(int x, int y)
または
getPixels(int[] pixels, int offset, int stride, int x, int y, int width, int height)
を使ってPixelを取得、

setPixel(int x, int y, int color)
または
setPixels(int[] pixels, int offset, int stride, int x, int y, int width, int height)
で設定します

というわけで、Pixel操作をしてみた

サンプルプログラム
  1. import android.app.Activity;  
  2. import android.content.Context;  
  3. import android.graphics.Bitmap;  
  4. import android.graphics.BitmapFactory;  
  5. import android.graphics.Canvas;  
  6. import android.graphics.Color;  
  7. import android.graphics.Paint;  
  8. import android.os.Bundle;  
  9. import android.view.View;  
  10.   
  11. public class BitmapTest2 extends Activity {  
  12.   Bitmap bitmap;  
  13.   int pixels[];  
  14.   @Override  
  15.   public void onCreate(Bundle savedInstanceState) {  
  16.     super.onCreate(savedInstanceState);  
  17.     setContentView(new BitmapTest2View(this));  
  18.   }  
  19.   
  20.   class BitmapTest2View extends View {  
  21.     public BitmapTest2View(Context context) {  
  22.       super(context);  
  23.      
  24.       // リソースから Bitmap を取得   
  25.       bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icon);  
  26.      
  27.       // もし編集不可なら、編集可能な Bitmap を複製  
  28.       if (!bitmap.isMutable()) {  
  29.         bitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true);  
  30.       }  
  31.      
  32.       int width = bitmap.getWidth();  
  33.       int height = bitmap.getHeight();  
  34.       pixels = new int[width * height];  
  35.      
  36.       // Bitmap から Pixel を取得  
  37.       bitmap.getPixels(pixels, 0, width, 00, width, height);  
  38.      
  39.       // Pixel 操作部分  
  40.       for (int y = 0; y < height; y++) {  
  41.         for (int x = 0; x < width; x++) {  
  42.           int pixel = pixels[x + y * width];  
  43.        
  44.           pixels[x + y * width] = Color.argb(  
  45.               Color.alpha(pixel),   
  46.               Color.green(pixel),   
  47.               Color.blue(pixel),  
  48.               Color.red(pixel)  
  49.           );  
  50.         }  
  51.       }  
  52.      
  53.       // Bitmap に Pixel を設定  
  54.       bitmap.setPixels(pixels, 0, width, 00, width, height);  
  55.     }  
  56.     
  57.     @Override  
  58.     public void onDraw(Canvas canvas) {  
  59.       // Bitmap の描画  
  60.       canvas.drawBitmap(bitmap, 00new Paint());  
  61.     }  
  62.   }  
  63. }  

プログラムを実行すると...


こんな感じ!

なんか紫色だと違和感が...

参考サイト
http://developer.android.com/intl/ja/reference/android/graphics/Bitmap.html

Fullscreen にしてみた

Window を フルスクリーンにするには

Windowのフラグに
WindowManager.LayoutParams.FLAG_FULLSCREEN
を設定します

また、タイトルバーを消すには
requestWindowFeature(Window.FEATURE_NO_TITLE);
を実行します

サンプルプログラム
  1. import android.app.Activity;  
  2. import android.os.Bundle;  
  3. import android.view.Window;  
  4. import android.view.WindowManager;  
  5.   
  6. public class FullScreenTest extends Activity {  
  7.   @Override  
  8.   public void onCreate(Bundle savedInstanceState) {  
  9.     super.onCreate(savedInstanceState);  
  10.     
  11.     // Window をフルスクリーンにする  
  12.     getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);  
  13.   
  14.     // Title Bar を非表示にする  
  15.     requestWindowFeature(Window.FEATURE_NO_TITLE);  
  16.        
  17.     setContentView(R.layout.main);  
  18.   }  
  19. }  

setContextView より前に書かないとエラーになります

プログラムを実行すると...


こんな感じ!

Bitmap を使ってみた

Bitmap は
java.lang.Object
  ↳ android.graphics.Bitmap
を使用します

また外部ファイルやリソースを読み込むために
java.lang.Object
  ↳ android.graphics.BitmapFactory
を使用します

例えば drawable に入れてあるリソースを Bitmap として使うには
BitmapFactory クラスで変換して利用する
その後 Bitmap クラスを用いて大きさを変換させたり
回転させたり...

というわけで、Bitmap をいじってみた

サンプルプログラム
  1. import android.app.Activity;  
  2. import android.content.Context;  
  3. import android.graphics.Bitmap;  
  4. import android.graphics.BitmapFactory;  
  5. import android.graphics.Canvas;  
  6. import android.graphics.Matrix;  
  7. import android.graphics.Paint;  
  8. import android.os.Bundle;  
  9. import android.view.View;  
  10.   
  11. public class BitmapTest extends Activity {  
  12.   private static final int NUM = 4;  
  13.   Bitmap bitmap[];  
  14.   Matrix matrix;  
  15.   @Override  
  16.   public void onCreate(Bundle savedInstanceState) {  
  17.     super.onCreate(savedInstanceState);  
  18.     setContentView(new BitmapTestView(this));  
  19.   }  
  20.   
  21.   class BitmapTestView extends View {  
  22.     public BitmapTestView(Context context) {  
  23.       super(context);  
  24.       bitmap = new Bitmap[NUM];  
  25.   
  26.       // リソースから Bitmap を取得   
  27.       bitmap[0] = BitmapFactory.decodeResource(getResources(), R.drawable.icon);  
  28.       // Bitmap のサイズの取得  
  29.       int width = bitmap[0].getWidth();  
  30.       int height = bitmap[0].getHeight();  
  31.      
  32.       // 45°回転させた Bitmap を作成  
  33.       matrix = new Matrix();  
  34.       matrix.postRotate(45.0f);  // 回転させる角度を指定  
  35.       bitmap[1] = Bitmap.createBitmap(bitmap[0], 00, width, height, matrix, true);  
  36.      
  37.       // Bitmap のスケールを指定して作成  
  38.       // この場合 (x * 0.5) × (y * 2) の大きさの画像になる  
  39.       matrix = new Matrix();  
  40.       matrix.postScale(0.5f, 2.0f);  // スケールを指定  
  41.       bitmap[2] = Bitmap.createBitmap(bitmap[0], 00, width, height, matrix, true);  
  42.      
  43.       // Bitmap の大きさを指定して作成  
  44.       // この場合 80 × 48 の大きさの画像になる  
  45.       bitmap[3] = Bitmap.createScaledBitmap(bitmap[0], 8048true);  
  46.     }  
  47.   
  48.     @Override  
  49.     public void onDraw(Canvas canvas) {  
  50.       Paint paint = new Paint();  
  51.       for (int i = 0; i < NUM; i++) {  
  52.         // Bitmap の描画  
  53.         canvas.drawBitmap(bitmap[i], i * 800, paint);  
  54.       }  
  55.     }  
  56.   }  
  57. }  

プログラムを実行すると...


こんな感じ!

ちなみに 引数の filter の部分(最後の引数)の値を変えて比較してみると...


こんな感じに! (左:true, 右:false)
filter をかけるとアンチエイリアスがかかっているっぽい

参考サイト
http://developer.android.com/intl/ja/reference/android/graphics/Bitmap.html
http://developer.android.com/intl/ja/reference/android/graphics/BitmapFactory.html

ソフトバンク、『X06HT HTC Desire』の予約開始


4月1日より、ソフトバンクモバイルのAndroid搭載スマートフォン「HTC Desire」の予約を開始しました

全国のソフトバンクモバイル携帯電話取り扱い店にて、1人1台まで受け付けるそうです

実質負担額は2万前後だとか

詳しくは公式サイトより

NTT docomo が 『Xperia (SO-01B)』を販売開始


4月1日より、NTT docomo から Google の Android OS を搭載したSony Ericsson製のスマートフォン『Xperia (SO-01B)』の販売を開始しました

詳しくは公式サイトより

スペシャルサイトがめっちゃかっこいいです

TimePickerDialog を使ってみた

TimePickerDialog は
java.lang.Object
  ↳ android.app.Dialog
    ↳ android.app.AlertDialog
      ↳ android.app.TimePickerDialog
を使います

というわけで、TimePickerDialog をいじってみた

サンプルプログラム
  1. import java.util.Calendar;  
  2.   
  3. import android.app.Activity;  
  4. import android.app.TimePickerDialog;  
  5. import android.app.TimePickerDialog.OnTimeSetListener;  
  6. import android.content.DialogInterface;  
  7. import android.os.Bundle;  
  8. import android.widget.TextView;  
  9. import android.widget.TimePicker;  
  10.   
  11. public class TimePickerDialogTest extends Activity {  
  12.   final Calendar calendar = Calendar.getInstance();  
  13.   // カレンダーから現在の '時' を取得  
  14.   int mHour = calendar.get(Calendar.HOUR_OF_DAY);  
  15.   // カレンダーから現在の '分' を取得  
  16.   int mMinute = calendar.get(Calendar.MINUTE);  
  17.   
  18.   TimePickerDialog timePickerDialog;  
  19.   
  20.   @Override  
  21.   public void onCreate(Bundle savedInstanceState) {  
  22.     super.onCreate(savedInstanceState);  
  23.     setContentView(R.layout.main);  
  24.       
  25.     // TImePickerDialog の時刻が変更された時に呼び出されるコールバックを登録  
  26.     TimePickerDialog.OnTimeSetListener listener = new TimePickerDialog.OnTimeSetListener() {  
  27.       public void onTimeSet(TimePicker view, int hourOfDay, int minute) {  
  28.         mHour = hourOfDay; // '時' を取得  
  29.         mMinute = minute;  // '分' を取得  
  30.       }  
  31.     };  
  32.   
  33.     // TimePickerDialog の作成  
  34.     timePickerDialog = new TimePickerDialog(  
  35.       this,     // 第1引数 : Context  
  36.       listener, // 第2引数 : TimePickerDialog.OnTimeSetListener  
  37.       mHour,    // 第3引数 : 時  
  38.       mMinute,  // 第4引数 : 分  
  39.       true      // 第5引数 : 24時間表示(true)かAM/PM表示(false)か  
  40.     );  
  41.   
  42.     // Dialog の Positive Button を設定  
  43.     timePickerDialog.setButton(  
  44.       DialogInterface.BUTTON_POSITIVE,  
  45.       "Positive",   
  46.       new DialogInterface.OnClickListener() {  
  47.         public void onClick(DialogInterface dialog, int which) {  
  48.           // Positive Button がクリックされた時の動作  
  49.         }  
  50.       }      
  51.     );  
  52.   
  53.     // Dialog の Negative Button を設定  
  54.     timePickerDialog.setButton(  
  55.       DialogInterface.BUTTON_NEGATIVE,   
  56.       "Negative",   
  57.       new DialogInterface.OnClickListener() {  
  58.         public void onClick(DialogInterface dialog, int which) {  
  59.           // Negative Button がクリックされた時の動作  
  60.         }  
  61.       }  
  62.     );  
  63.     
  64.     // Dialog の Neutral Button を設定  
  65.     timePickerDialog.setButton(  
  66.       DialogInterface.BUTTON_NEUTRAL,   
  67.       "Neutral",   
  68.       new DialogInterface.OnClickListener() {  
  69.         public void onClick(DialogInterface dialog, int which) {  
  70.           // Neutral Button がクリックされた時の動作  
  71.         }  
  72.       }  
  73.     );  
  74.   
  75.     // TimePickerDialog の表示  
  76.     timePickerDialog.show();  
  77.   }  
  78. }  

プログラムを実行すると...


AM/PM表示のとき

こんな感じ!

ProgressDialog を使ってみた

ProgressDilaog は
java.lang.Object
  ↳ android.app.Dialog
    ↳ android.app.AlertDialog
      ↳ android.app.ProgressDialog
を使います

というわけで、ProgressDialog をいじってみた

サンプルプログラム
  1. import android.app.Activity;  
  2. import android.app.ProgressDialog;  
  3. import android.content.DialogInterface;  
  4. import android.os.Bundle;  
  5. import android.view.View;  
  6.   
  7. public class ProgressDialogTest extends Activity implements Runnable {  
  8.   ProgressDialog progressDialog;  
  9.   Thread thread;  
  10.   
  11.   @Override  
  12.   public void onCreate(Bundle savedInstanceState) {  
  13.     super.onCreate(savedInstanceState);  
  14.     setContentView(R.layout.progressdialogtest);  
  15.   
  16.     progressDialog = new ProgressDialog(this);  
  17.     
  18.     // ProgressDialog のタイトルを設定  
  19.     progressDialog.setTitle("Title");  
  20.   
  21.     // ProgressDialog のメッセージを設定  
  22.     progressDialog.setMessage("Message");  
  23.   
  24.     // ProgressDialog の確定(false)/不確定(true)を設定します  
  25.     progressDialog.setIndeterminate(false);  
  26.   
  27.     // ProgressDialog のスタイルを水平スタイルに設定  
  28.     progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);  
  29.     // 円スタイルの場合  
  30.     // progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);  
  31.   
  32.     // ProgressDialog の最大値を設定 (水平の時)  
  33.     progressDialog.setMax(100);  
  34.   
  35.     // ProgressDialog の初期値を設定 (水平の時)  
  36.     progressDialog.incrementProgressBy(0);  
  37.   
  38.     // ProgressDialog のセカンダリ値を設定 (水平の時)  
  39.     progressDialog.incrementSecondaryProgressBy(50);  
  40.   
  41.     // ProgressDialog のキャンセルが可能かどうか  
  42.     progressDialog.setCancelable(false);  
  43.    
  44.     // ProgressDialog のキャンセルされた時に呼び出されるコールバックを登録  
  45.     progressDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {  
  46.       public void onCancel(DialogInterface dialog) {  
  47.         // Thread を停止  
  48.         stop();  
  49.       }  
  50.     });  
  51.   
  52.     // Start ボタン  
  53.     findViewById(R.id.ProgressDialogTest_Button).setOnClickListener(    
  54.       new View.OnClickListener() {    
  55.         public void onClick(View view) {    
  56.           // ProgressDialog を表示  
  57.           progressDialog.show();  
  58.           // Thread を起動  
  59.           init();  
  60.           start();  
  61.         }    
  62.       }  
  63.     );  
  64.   
  65.     // ProgressDialog の Cancel ボタン  
  66.     progressDialog.setButton(  
  67.       DialogInterface.BUTTON_NEGATIVE,  
  68.       "Cancel",  
  69.       new DialogInterface.OnClickListener() {  
  70.         public void onClick(DialogInterface dialog, int which) {  
  71.           // ProgressDialog をキャンセル  
  72.           dialog.cancel();   
  73.         }  
  74.       }  
  75.     );  
  76.   }  
  77.    
  78.   /** Runnable のプログラム */  
  79.   public void init() {  
  80.     thread = null;  
  81.   }  
  82.   public void start() {  
  83.     if (thread == null) {  
  84.       thread = new Thread(this);  
  85.       thread.start();  
  86.     }  
  87.   }  
  88.   public void run() {  
  89.     int count = 0;  
  90.     Thread thisThread = Thread.currentThread();  
  91.     while (thisThread == thread) {  
  92.       // 100ms毎に Progress Bar を進める  
  93.       progressDialog.setProgress(count++);    
  94.       try {  
  95.         thread.sleep(100);    
  96.       } catch (InterruptedException e) {  
  97.       }  
  98.       if (count >= progressDialog.getMax()) {  
  99.         // Progress が完了  
  100.         break;  
  101.       }  
  102.     }  
  103.     // Progress Dialog を消す  
  104.     progressDialog.dismiss();  
  105.   }  
  106.   public void stop() {  
  107.     thread = null;  
  108.   }  
  109. }  

プログラムを実行すると...

円スタイルのとき

こんな感じ!

DatePickerDialog を使ってみた

DatePickerDialog は
java.lang.Object
  ↳ android.app.Dialog
    ↳ android.app.AlertDialog
      ↳ android.app.DatePickerDialog
を使います

というわけで、DatePickerDialog をいじってみた

サンプルプログラム
  1. import java.util.Calendar;  
  2. import android.app.Activity;  
  3. import android.app.DatePickerDialog;  
  4. import android.content.DialogInterface;  
  5. import android.os.Bundle;  
  6. import android.widget.DatePicker;  
  7.   
  8. public class DatePickerDialogTest extends Activity {  
  9.   final Calendar calendar = Calendar.getInstance();  
  10.   // カレンダーから現在の '年' を取得  
  11.   int mYear = calendar.get(Calendar.YEAR);  
  12.   // カレンダーから現在の '月' を取得  
  13.   int mMonth = calendar.get(Calendar.MONTH);  
  14.   // カレンダーから現在の '日' を取得  
  15.   int mDay = calendar.get(Calendar.DAY_OF_MONTH);  
  16.   
  17.   DatePickerDialog datePickerDialog;  
  18.   
  19.   @Override  
  20.   public void onCreate(Bundle savedInstanceState) {  
  21.     super.onCreate(savedInstanceState);  
  22.     setContentView(R.layout.main);  
  23.   
  24.     // DatePickerDialog の日付が変更されたときに呼び出されるコールバックを登録  
  25.     DatePickerDialog.OnDateSetListener listener = new DatePickerDialog.OnDateSetListener() {  
  26.       public void onDateSet(  
  27.           DatePicker view,   
  28.           int year,  
  29.           int monthOfYear,  
  30.           int dayOfMonth) {                  
  31.         mYear = year;         // '年' を取得  
  32.         mMonth = monthOfYear; // '月' を取得  
  33.         mDay = dayOfMonth;    // '日' を取得  
  34.       }  
  35.     };  
  36.   
  37.     // DatePickerDialog の作成  
  38.     datePickerDialog = new DatePickerDialog(  
  39.       this,     // 第1引数 : Context  
  40.       listener, // 第2引数 : DatePickerDialog.OnDateSetListener  
  41.       mYear,    // 第3引数 : 年  
  42.       mMonth,   // 第4引数 : 月  
  43.       mDay      // 第5引数 : 日  
  44.     );  
  45.   
  46.     // Dialog の Positive Button を設定  
  47.     datePickerDialog.setButton(  
  48.       DialogInterface.BUTTON_POSITIVE,  
  49.         "Positive",   
  50.         new DialogInterface.OnClickListener() {  
  51.           public void onClick(DialogInterface dialog, int which) {  
  52.             // Positive Button がクリックされた時の動作  
  53.           }  
  54.         }      
  55.     );  
  56.   
  57.     // Dialog の Negative Button を設定  
  58.     datePickerDialog.setButton(  
  59.       DialogInterface.BUTTON_NEGATIVE,   
  60.       "Negative",   
  61.       new DialogInterface.OnClickListener() {  
  62.         public void onClick(DialogInterface dialog, int which) {  
  63.           // Negative Button がクリックされた時の動作  
  64.         }  
  65.       }  
  66.     );  
  67.     
  68.     // Dialog の Neutral Button を設定  
  69.     datePickerDialog.setButton(  
  70.       DialogInterface.BUTTON_NEUTRAL,   
  71.       "Neutral",   
  72.       new DialogInterface.OnClickListener() {  
  73.         public void onClick(DialogInterface dialog, int which) {  
  74.           // Neutral Button がクリックされた時の動作  
  75.         }  
  76.       }  
  77.     );  
  78.   
  79.     // DatePickerDialog の表示  
  80.     datePickerDialog.show();  
  81.   }  
  82. }  

プログラムを実行すると...


こんな感じ!