2013年11月25日月曜日

[Macアプリ] PNG画像のサイズを減らすアプリ

ImageAlphaというMac向けアプリを使うことで、PNG画像のサイズを減らせます。
(ダウンロードサイト:http://pngmini.com/

24ビットのPNG画像をパレットを使用した8ビットに変換することでサイズを削減します。色彩豊かな画像の場合は、荒くなってしまいます。アイコン画像などは比較的色が少なく適している。

試しに、画像を256色 に減らしてみると、元の画像と比べて80%削減できました。
 8色に減らすと、88%削減できましたがパッと見で荒いです。
 背景も複数から選択して表示を試すことができます。

僕はAndroidアプリ向けの画像を作成するときに、容量を削減でき重宝しています。
OS X Mavericksでも問題無く動作しています。

2013年10月19日土曜日

[Mac] ダウンロードしたアプリが「壊れているためひらけません」と表示される

Android Studioの新しいバージョンをダウンロードしたけど、「"Android Studio.app"は壊れているため開けません。"ゴミ箱"に入れる必要があります。」と表示されて起動できない。


ダウンロードに失敗したかと思い、再度ダウンロードしましたがダメでした。
試行錯誤している内に、「システム環境設定」のセキュリティ設定を変えることで起動できました。

「ダウンロードしたアプリケーションの実行許可」の設定を「すべてのアプリケーションを許可」に一時的に変更しました。一度アプリ起動すれば、それ以降は設定を戻しても問題なかったです。


2013年10月9日水曜日

[Android SDK] ダイアログを自由にカスタマイズする

メモガキの日時設定画面はダイアログをカスタマイズして作成している。Dialogを継承して、onCreateをオーバライドしてsetContentViewを自由なレイアウトを指定します。タイトルバーや境界線を無くし、全画面表示にしています。


  1. public class TestDialog extends Dialog {  
  2.  /* 〜〜〜 一部省略 〜〜〜*/  
  3.  @Override  
  4.  protected void onCreate(Bundle savedInstanceState) {  
  5.   super.onCreate(savedInstanceState);  
  6.   
  7.                 // タイトルバーを非表示にする  
  8.   requestWindowFeature(Window.FEATURE_NO_TITLE);   
  9.   
  10.   setContentView(R.layout.dlg_deadline);  
  11.   
  12.                 // ダイアログの背景(境界線)を無くす(透明)  
  13.   getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));  
  14.   
  15.                 // ダイアログの大きさ最大にする(任意のサイズも指定可能)  
  16.                 getWindow().setLayout(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);  
  17.   
  18.  }  
  19.  /* 〜〜〜 一部省略 〜〜〜*/  
  20. }  

2013年10月7日月曜日

[Android SDK] 動的に設定画面(Preference)を作成する

ほとんどのAndroidアプリには設定画面が用意されている。

(例:メモガキの設定画面)

こういった設定画面は、.xmlファイルに記述するケースが多いが動的にプログラミングで作成することもできる。
例えば、デバッグ時、AndroidOSのバージョンに応じて表示する設定項目の場合に使える。

1から作成する場合

まずは設定項目を作成するために、PreferenceManagerを取得する。
  1. // For Activity  
  2. PreferenceManager PreferenceActivity::getPreferenceManager()  
  3.   
  4. // For Fragment  
  5. PreferenceManager PreferenceFragment::getPreferenceManager()  
PreferenceManagerで設定項目のルート項目を作成する。
  1. PreferenceScreen PreferenceManager::createPreferenceScreen(Context context);  
以降は、設定項目を作成して追加して行く。
  1. // Context context;  
  2. PreferenceScreen root = getPreferenceManager().createPreferenceScreen(context);  
  3. PreferenceCategory category = new PreferenceCategory(context);  
  4. category.setTitle("Category");  
  5. root.addPreference(category);  
  6.   
  7. PreferenceScreen item = getPreferenceManager().createPreferenceScreen(context);  
  8. item.setTitle("Item");  
  9. category.add(item);  
最後に、設定画面に設定する。
  1. // For Activity  
  2. // void PreferenceScreen::setPreferenceScreen(PreferenceScreen preferenceScreen)  
  3. //   
  4. // For Fragment  
  5. // void PreferenceFragment::setPreferenceScreen(PreferenceScreen preferenceScreen)  
  6. //  
  7. setPreferenceScreen(root);  

既存の設定画面に追加する場合

既存の設定項目のルート項目を取得する。
  1. // For Activity  
  2. PreferenceScreen PreferenceActivity::getPreferenceScreen()  
  3.   
  4. // For Fragment  
  5. PreferenceScreen PreferenceFragment::getPreferenceScreen()  
取得したルート項目にさきほどと同様に追加していく。


参考までに

メモガキではアプリの更新履歴を、ファイル(res/raw)から更新履歴を情報を読み込み、動的に設定画面をベースに表示している。

  1. public class RpNoteVersionFragment extends PreferenceListFragment {  
  2.  @Override  
  3.  public void onCreate(Bundle savedInstanceState) {  
  4.   super.onCreate(savedInstanceState);  
  5.   setPreferenceScreen(createReleaseNote());  
  6.  }  
  7.  public PreferenceScreen createReleaseNote() {  
  8.   final Context c = getActivity();  
  9.   PreferenceScreen root = getPreferenceManager().createPreferenceScreen(c);  
  10.     
  11.   BufferedReader reader = null;  
  12.   InputStream stream = null;  
  13.   String buffer = null;  
  14.   PreferenceCategory category = null;  
  15.   try {  
  16.    stream = c.getResources().openRawResource(R.raw.release_note);  
  17.    reader = new BufferedReader(new InputStreamReader(stream));  
  18.    while ((buffer = reader.readLine()) != null) {  
  19.     if (category == null) {  
  20.      category = new PreferenceCategory(c);  
  21.      category.setTitle(buffer);  
  22.      root.addPreference(category);  
  23.     } else if (buffer.equals("")) {  
  24.      category = null;  
  25.     } else {  
  26.      Preference item = new Preference(c);  
  27.      item.setTitle(buffer);  
  28.      item.setLayoutResource(R.layout.pref_single_item);  
  29.      category.addPreference(item);  
  30.     }  
  31.    }  
  32.   } catch (IOException ioe) {  
  33.      
  34.   } finally {  
  35.    if (reader != null) {  
  36.     try {  
  37.      reader.close();  
  38.     } catch (IOException ioe) {}  
  39.    }  
  40.    if (stream != null) {  
  41.     try {  
  42.      stream.close();  
  43.     } catch (IOException ioe2) {}  
  44.    }  
  45.   }  
  46.   return root;  
  47.  }  
  48. }  
  49.   
  50. // R.raw.release_noteの中身  
  51. Ver.0.3.0  
  52. Append text to an existing note with share.  
  53. Add icons of category.  
  54.   
  55. Ver.0.2.0  
  56. Change an order of category display.  
  57.   
  58. Ver.0.1.1  
  59. Display a widget, today's number of schedules.   
  60.   
  61. Ver.0.0.0  
  62. First version   

2013年1月6日日曜日

[無印良品] 旅行に便利な消臭効果のある袋

久々に無印良品に行ってきました。
いつ来ても、雰囲気が和みます。お店のレイアウトに、BGMが好きです。

正月バゲーンだから、無印良品も安売り品がないか探していると

消臭巾着というものがありました(写真左のやつ)。
説明書きに、「使用後の衣類等の不快臭を減少させる消臭生地を使用。洗濯後も効果が持続します。」って書かれていました。

これは、旅行、運動に便利ですね。
30%OFFってこともあって、即買っちゃいました(定価1,100円)。


これまるまるしてるけど、収納されている袋を出すと円柱っぽい袋になります(直径18×34cm)。



ついでに、USB端子つきのタップも購入してきました。
USB端子は合計出力1000mAなのでスマホを充電するのに使えそうです。

USBアダプタでこれでごちゃごちゃしてたタップを整理できそうです。