2012年11月13日火曜日

[Android SDK] 設定画面のレイアウトをカスタマイズする

Androidアプリには設定画面がつきものです。標準で設定画面を作るためのクラス(PreferenceActivity)が用意されており、XMLで設定項目を記述するだけで簡単に作れる。

ただ、設定画面のレイアウトをカスタマイズするには特殊なやり方が必要になります。

PreferenceActivityを継承してActivityを作るのは同じですが、setContentViewメソッドでレイアウトファイル(XML)を指定するところがポイント。
  1. public class RpNotePreferenceActivity extends PreferenceActivity {  
  2.   @Override  
  3.   public void onCreate(Bundle savedInstanceState) {  
  4.     super.onCreate(savedInstanceState);  
  5.     setContentView(R.layout.act_preference);  
  6.     addPreferencesFromResource(R.xml.preference);  
  7.   }  
  8. }  

単純にレイアウトファイル(XML)を作成するだけではダメで、設定画面に置き換えるListViewを「android:id="@android:id/list"」属性付きで追加する必要があります。
簡単な例ですと次のようにすると、
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     xmlns:ads="http://schemas.android.com/apk/lib/com.google.ads"  
  4.     xmlns:tools="http://schemas.android.com/tools"  
  5.     android:layout_width="fill_parent"  
  6.     android:layout_height="fill_parent"  
  7.     android:orientation="vertical"  
  8.     tools:context=".activity.RpNotePreferenceActivity" >  
  9.   
  10.     <ListView  
  11.         android:id="@android:id/list"  
  12.         android:layout_width="fill_parent"  
  13.         android:layout_height="fill_parent"  
  14.         android:layout_weight="1" />  
  15.  <LinearLayout  
  16.         android:layout_width="fill_parent"  
  17.         android:layout_height="wrap_content"  
  18.         android:gravity="center_horizontal">  
  19.   <Button  
  20.       android:id="@+id/button1"  
  21.       android:layout_width="fill_parent"  
  22.       android:layout_height="wrap_content"  
  23.       android:text="Button" />  
  24.     </LinearLayout>  
  25. </LinearLayout>  

こんな感じで、画面下側にボタンがあるような設定画面が作れます(実際には、リストが設定項目に置き換わります)。

試してみてください。

2012年11月12日月曜日

[Android SDK] ImageViewを最前面にフローティングさせる

ドラッグ可能なリストビューを作成する過程で、ドラッグ中のアイテムを最前面でフローティングさせるのに苦労しましたので、そのやり方を記載します。
★オレンジ色の浮いているやつです。


実際は、ドラッグ対象のアイテムをBitmap化として、ImageViewで最前面に表示しています。

1.ViewをBitmapに変換する

たとえば、ListViewであれば、getChildAtでアイテムをViewとして取得できます。Bitmapを生成して、Canvasで描画すれば、簡単にViewをBitmapに変換できます。
  1. // View view;  
  2. Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888);  
  3. Canvas canvas = new Canvas();  
  4. canvas.setBitmap(bitmap);  
  5. view.draw(canvas);  
  6. // (e.g.)  
  7. // ImageView imageView;  
  8. // imageView.setImageBitmap(bitmap);  

2.ImageViewを最前面に表示する

最前面に表示するには、ImageViewをWindowManagerに追加します。
WindowManager.addView(View, WindowManager.LayoutParams)メソッドを使います。なお、いらなくなったらWindowManager.removeView(View)で削除できます。
  1. WindowManager mWindowMgr = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);  
  2. mWindowMgr.addView(imageView, layoutParams);  
レイアウトパラメータを指定する必要があり、任意の位置に表示するのであれば次の値がいいと思います。
  1. WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();  
  2. layoutParams.gravity = Gravity.TOP | Gravity.LEFT;  
  3. layoutParams.x       = 0// 表示位置 x  
  4. layoutParams.y       = 0// 表示位置 y  
  5. layoutParams.width   = WindowManager.LayoutParams.WRAP_CONTENT;  
  6. layoutParams.height  = WindowManager.LayoutParams.WRAP_CONTENT;  
  7. layoutParams.flags   = WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;  
  8. layoutParams.format  = PixelFormat.TRANSLUCENT; // 透明を有効化  

3.ImageViewの透明度指定

ドラッグ中のアイテムを見やすくするために、ImageViewを透過します。
ImageView.setAlpha(int)メソッドを使います。0〜255で透明度を指定します。値が大きいほど不透明になります。
  1. //ImageView imageView;  
  2. imageView.setAlpha(128); // 透明度50%   

ただ、WindowManagerで透明度を有効にするには、必ず次を指定しておく必要があります。
  1. // WindowManager.LayoutParams layoutParams;  
  2. layoutParams.format  = PixelFormat.TRANSLUCENT; // 透明を有効化  

4.ImageViewを移動させるには

WindowManager.updateViewLayout(View, WindowManager.LayoutParams)メソッドでレイアウトを更新します。
WindowManager.addView(View, WindowManager.LayoutParams)メソッド時のWindowManager.LayoutParamsを保持しておき、x,y座標を変更して使いますと楽です。
  1. // WindowManager mWindowMgr;  
  2. // WindowManager.LayoutParams layoutParams;  
  3. // ImageView imageView;  
  4. layoutParams.x       = 0// 表示位置 x  
  5. layoutParams.y       = 0// 表示位置 y  
  6. mWindowMgr.updateViewLayout(imageView, layoutParams);  

こんな感じに、最前面でImageViewを自由に移動させらました。
ご参考にしてみてください。


2012年11月10日土曜日

[Android SDK] 埋め込みテキストファイルから文字列を取り出す

アプリ内に埋め込んだテキストファイルを文字列として取り出す方法を記載します。

ファイル構成

翻訳版も対応しているので、rawフォルダ名を変えて複数作成してください。
  1.  +res  
  2.   +raw  
  3.    +update.txt (英語テキストファイル)  
  4.   +raw-ja  
  5.    +update.txt (日本語テキストファイル)  

読み出しソース

ResourceクラスのopenRawResourceメソッドを使って読み出しをします。
  1. // Context c;  
  2. String text = getRawTextFile(c, R.raw.update.txt);  
  3.   
  4. private static String getRawTextFile(Context context, int resId) {  
  5.   InputStream st = null;  
  6.   byte[] buffer = null;  
  7.   try {  
  8.     st = context.getResources().openRawResource(resId);  
  9.       buffer = new byte[st.available()];  
  10.     while((st.read(buffer)) != -1) {}  
  11.   } catch (IOException e) {  
  12.   } finally{  
  13.     if (st != null) {  
  14.       try{  
  15.         st.close();  
  16.       }catch(IOException e2) {}  
  17.     }  
  18.   }  
  19.   if (buffer != null) {  
  20.     return new String(buffer);  
  21.   }  
  22.   return null;  
  23. }  

こんな感じで、アプリの更新履歴をテキストファイルとしてアプリ内に埋め込んで使っています。

2012年11月9日金曜日

[Android SDK] ResourceからカラーフィルタしたBitmapを作成する

Resourceにある画像をカラーフィルタ処理をした、Bitmapを作成する方法を書きます。

ソース

  1. // RemoteViews rv;  
  2. // int resId;  
  3. // Context context;  
  4. Bitmap icon = BitmapFactory.decodeResource(context.getResources(), resId);  
  5. Bitmap bitmap = Bitmap.createBitmap(icon.getWidth(), icon.getHeight(), icon.getConfig());  
  6. LightingColorFilter filter1 = new LightingColorFilter(0xFFFFFF, Color.WHITE);  
  7. Canvas canvas = new Canvas(bitmap);  
  8. Paint p = new Paint();  
  9. p.setColorFilter(filter1);  
  10. canvas.drawBitmap(icon, 00, p);  
  11. // rv.setImageViewBitmap(R.id.icon, bitmap);  

解説

ウィジェット作成していて、画像を貼り付けるにはResourceIDかBitmapしか方法がなくて、DrawableだったらsetColorFilterを使えば簡単にできたんだけど。仕方ないので、バッファBimapにカラーフィルタ処理付きで画像(Bitmap)を描画して作成しました。

結果

こんなアイコンをウィジェットに白色加工して貼り付けました。





色違いアイコンを作り直さなくていいから楽ちん。



[Android アプリ] メモガキ (Memogaki)の公開

自作のAndroidアプリ「メモガキ (Memogaki)」を公開しました。

ダウンロード (Google Play)

簡単に言えば、TODOリストのような、メモアプリです。
メモのカテゴリ分けができるので、買い物リスト、予定、メモといった風に同じアプリで使い回しができます。

アプリの画面

実際の画面をペタペタと、、、

メモ閲覧画面

メモが一覧で表示されます。左側のタブでカテゴリを切り替えられます。


カレンダー表示

メモを予定して使う場合は、メモに日時をつけることでカレンダーで表示できます

メモ作成画面(簡易)

メモ程度なら、サクサクつくれるような画面にしてあります。
買い物メモで画面が切り替わってしまうと、入力するのが大変ですからね。

作成のきっかけ

アプリの開発のきっかけは、忘れ物防止、手軽に入力できるアプリがほしかった。
Google Playで探してみましたが、見つからなかったので開発してみました。

TODOリストようなですから、リマインダー機能(お知らせ機能)があります。
直前にアラームが鳴って、簡単な概要さえ分かれば思い出せますからね。

僕は、予定表、買い物リスト、アプリの不具合修正リスト、バスの時刻表メモ(写真)として使っています。いろいろな使い方を模索しつつ、今後改良していきます。


以上の説明で分かりづらい箇所もあるかと思いますが、ぜひ活用してみてください。

ダウンロード (Google Play)

更新履歴

ver.0.7.0(2013/7/25)

メモのリマインダー機能を繰り返し通知できるよう機能を追加しました。
例えば、毎週行う作業(TODO)に利用すると、毎週メモを再設定しなくとも、毎週通知してくれます。
メモの作成時の日時設定から設定できます。

ver.0.6.0(2013/2/2)

ウィジェットにカレンダーを追加しました。カレンダーからいつ予定が入っているのか確認できます。

ver.0.5.0(2012/12/26)

メモ一覧表示を改善しました。メモ一覧を「今日、明日、今週、今週以降、日時なし」の5つに区切って表示するよう改善しました。

ver.0.4.0(2012/11/20)

ウィジェット作成時にプレビュー機能がつきました。

ver.0.3.0 (2012/11/17)

他アプリから共有機能で、既存ノートの本文に内容を追記できるようになりました。

ver.0.2.0 (2012/11/12)

メニューから、カテゴリの並び替えが可能になりました。長押しのドラッグで簡単に並び替えられます。

ver.0.1.1 (2012/11/8)

今日の予定数を表示するウィジェット機能がつきました。すべてもしくはカテゴリー限定で表示できます。

ver.0.0.0 (2012/11/7)

初公開