2011年12月27日火曜日

通話履歴 S(Call History Simple) ver.2.0.0

version 2.0.0
 不在着信時の呼出時間表示に対応
 発着信タブを直接呼び出すWidgetボタンを廃止(ショートカットはそのまま使用できます)


今回のバージョンアップで、不在着信の呼出時間を表示できるようになりました。
[設定]の[通話/呼出(不在時)時間を表示する]をOnにしてください。
今回のバージョンをインストールしてからの不在着信に対応しています。

処理内容的には、バックグランドで着信状態を監視し不在着信の場合は独自のデータベースに呼出時間等を保存しています。バックグランド処理をしていますのでタスクをKILLしないように設定してください。

以下の場合取得を失敗する可能性があります。
・タスクがKILLしてしまいバックグランド処理がされていない。
・システムの着信時間と当アプリで取得した着信時間に大きなズレ(0.5秒以上)がある場合。
・グループ着信及び、割込通話の場合。

取得を失敗した場合は、*印が表示されます。

2011年12月20日火曜日

不在着信時の呼出時間表示

不在着信時の呼出時間を表示しようかと、悪戦苦闘しております。(すでに、あきらめモードですが・・・

発着信の履歴ってのはandroidが標準でもってるデータベースがあります。

ほとんどの通話履歴のアプリは、このデータベースを使用してると思います。

しかしながら、このデータベースには呼出時間は保存されておりません。(通話時間は保存されてます)

なので、呼出時間を表示させるには独自に保存しなければなりません。

となると、呼出を検地して通話の判別をし不在着信の場合、その時間を取得するプログラムが必要になります。
もちろん、常時監視しないとだめなんでサービスでの実装となります。

簡単そうですね・・・これだけの処理なら簡単です。

PhoneStateListenerという便利なクラスがあり、電話機の状態が変化すると呼び出されるからね。

上記だけの判断なら
 CALLING-OFFHOOK-IDLE 通話
 CALLING-IDLE          不在

これは、単独で電話がかかってきた時だけですね。

実はエミュレターでシュミレーションを行うと、単独通話、グループ通話、割込み通話ができるんです。

実機でも、グループはできそうにないけど割込み通話はできますよね。

まあ、ここらはいろいろやってみるとどうなるかはわかるかな・・・

あと、実機では終話ボタンの挙動が各メーカーによって違いそうです。

終話ボタンで切った場合、不在にするかどうかもメーカーによって違うみたい。

次に、andoroidの通話履歴データベースの着信時間とこちらが作成したアプリでの着信時間にずれが生じます。

まあ、当たり前なんですけど めんどくさいです。

時間のずれは、エミュレーターだと 10ms以内でしたが 実機だと 100msをかるく越えることが・・・

これは、たぶんスマフォの処理速度で変わって来るでしょ・・・




なんだかんだと、いろいろめんどくさいんです><

できるだけ、取得できるようにしてみたんですが今テスト中です。

とりあえず、バグで強制終了とかがなければ 近いうちにバージョンアップさせます。

2011年11月16日水曜日

通話履歴アプリの有料版

作成当初は、有料版はつくらない予定だったのですが、有料版がほしいとの意見がありましたので作りました。

価格は、200円です(150円でも、よかったんですが他の方が200円にしてたので相場を下げたら悪いかなと・・・

たぶん、そんなに売れないと思いますが ご購入される方は、まず無料版を使用してからに してくださいね。

無料版で、エラーがいくつか残ってるんで不安なんです。けど何をしたらエラーになってるのかがわからず・・・><

そんな、状態での有料版なんで ご了承ください。

エラーが出た場合 ここへのコメントか直接メールいただければ すごく助かります。

ご面倒をかけますが、よろしくお願いいたします。


広告ライブラリーが更新されてましたので、無料版も近々UP予定です。(内容はかわってません)
有料版の紹介をメニューに加えるくらい・・・

無料版での 不在着信が消えないとコメントがありましたが、たぶんacro側のバグか仕様みたいです。(通知を消去すると 不在着信のフラグがたったままになってまして、acroのディフォルトの履歴で確認すると消えてました。あと、acroのアップデートの内容の中に不在着信になる不具合があるの修正しましたと あったので、たぶんそうじゃないかと思います)

2011年7月22日金曜日

電話帳アプリの進行状況

ぼちぼち、作ってるんで全然前に進んできません。

けど、一応フリガナで振り分けてリスト一覧表示はできるようになりました。

とりあえず、編集機能は無しで一覧表示から個別表示をして 電話をかけるメールを作成するまでできるようにしたいなと思っておりますが・・・

アカウントと関係がわかってないから、今のところ全部引っ張ってきてるような・・・

ああ 難しいわぁ

2011年7月20日水曜日

通話履歴 3D(Call History 3D) Ver.1.2.3

version 1.2.3
 左右のフリックでタブを変更できるようにしました。

2011年7月19日火曜日

通話履歴 S(Call History Simple) ver.1.1.2

version 1.1.2
 左右のフリックでタブを変更できるようにしました。

 動きが変になるようでしたら、ご連絡ください。

ぬぅ・・・

広告を日本語以外はAdMobにしてみたんだけど・・・一気にクリック数が減った・・・

元に戻そう はう・・・ まあ、わかったことは海外の方は以外にクリックしてくれるってことですね(たぶんシェアウェア感覚(かんぱ感覚)で押してくれるんだろうね

戻すついでに、できるかわかりませんが 左右フリック入力でタブ変更できるようにしてみます。

ついでに、電話帳アプリなんですがフリガナでの一覧までできているかな(まだデータの取得をやってないけど・・・
どうやったら、フリガナでソートかけて取得するのかが、わかってないという

2011年7月14日木曜日

通話履歴 S(Call History Simple) ver.1.1.1

version 1.1.1
 通話時間の書式を変更できるようにしました。
 ① [999:99]
 ② [999分99秒]
 ③ [999min.99sec.]
 ②と③の書式は、1分未満の場合 分部分は表示しません。

 あと、言語が日本語以外の場合 広告にAdMobを試験的に使用しています。

2011年7月13日水曜日

電話帳アプリってのを

私は、IS03を使用しているので実機でのテストはIS03のみです。

IS03というか、シャープのandroidにはメーカーアプリが優秀というかそこそこ使い勝手いいので、あんまり困らないのですが(標準で着信拒否アプリ等もくみこまれている)IS04を使用している方から 電話帳が使いにくいから電話帳を作ってと言われました。
まあ、よくわかってないので IS03風の電話帳でも作ってみようかなと思ったんですが レイアウトの部分で既に挫けそうです・・・

途中で断念するかも・・・ごめん

あと、簡単なファイルマネージャーも依頼されてるけど・・・はふぅ 現在モチベーションダウンしております。

2011年7月9日土曜日

通話履歴 S(Call History Simple) ver.1.1.0

version 1.1.0
 各タブの背景色をそれぞれ設定できるようにしました。

通話履歴 S(Call History Simple) ver.1.0.8 ~ 1.0.9

version 1.0.8
 発着信タブ表示ボタンをショートカットで登録できるようにしました。
 この変更により、ドックへの登録と、アイコンを変更できるようになりました。

version 1.0.9
 ショートカットをドックへ配置したときにアプリアイコンに変わってしまうランチャーアプリがあったので、変わらないように対応しました。

通話履歴 3D(Call History 3D) Ver.1.2.1 ~ 1.2.2

version 1.2.1
 発着信タブ表示ボタンをショートカットで登録できるようにしました。
 この変更により、ドックへの登録と、アイコンを変更できるようになりました。

version 1.2.2
 ショートカットをドックへ配置したときにアプリアイコンに変わってしまうランチャーアプリがあったので、変わらないように対応しました。

2011年6月29日水曜日

ショートカットへの登録方法

今まで、ショートカットの存在を忘れておりました。
通話履歴で、発信・着信のボタンをわざわざウィジェットで用意していましたが・・・ただのボタンなんで、ショートカットで十分でした(アセアセ

と、いうことでアプリに起動用のショートカットを作成する方法を書いておきます。

Manifest部分

    
        
        
    

Manifest部分は、ホーム画面長押し → ホーム画面に追加 ダイアログ → ショートカット で表示されるショートカットを選択するダイアログでの表示を設定しています。
android:name ・・・ ショートカットの内容を定義したクラス名
android:label ・・・ ダイアログ内でのラベル名
android:icon ・・・ ダイアログ内でのアイコン
label,iconは設定しなければアプリ自体のアイコンとアプリ名になります。

IncomingShortcut.Class部分(Activityで実装)
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Parcelable;

public class IncomingShortcut extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);

        // ショートカットの内容 インテントを発行
        Intent shortcutIntent = new Intent(getApplicationContext(), "実行するClass(***.class)を記述");
        // 何か渡したい場合は、putExtraで渡す(起動したいタブIDとか
        shortcutIntent.putExtra("****", *);

        // ホーム画面に設置した場合のショートカットの登録内容
        Intent intent = new Intent();
        intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
        Parcelable iconResource = Intent.ShortcutIconResource.fromContext(getApplicationContext(), R.drawable.call_incoming);
        // ホーム画面に設置した場合に表示されるアイコンの設定
        intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, iconResource);
        // ホーム画面に設置した場合に表示されるラベル名の設定
        intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, getString(R.string.incoming));
  
        setResult(RESULT_OK, intent);
        finish();
    }

}
Class部分は、実際にホームに置いた場合の内容を書くみたいです。通話履歴では 発信履歴ボタンと着信履歴ボタンの2つを置いて、表示するタブを変えるためshortcutIntent.putExtraで表示するタブのIDをわたしてます。あと、Activityですので、finish()を呼び出してすぐに終了させてます。

これで、ホーム画面に設置できるショートカットができます。ショートカットにすることで ドックを変更できるホームランチャーなら ドックへの設置も行えるようになります。

(追記)
上のコードだとホームランチャーによっては、ドックへショートカットを置いたときにアイコンがアプリアイコンに変わってしまうことがあるみたいです。
なんで、最初にショートカット作成かどうかを判断するようにして、作成以外の場合は新しいIntentでAvitityを呼び出すようにしました。

2011年6月26日日曜日

通話履歴 3D(Call History 3D) Ver.1.1.8 ~ 1.2.0

version 1.1.8
カラーの選択数を増やしました。

version 1.1.9
アプリ起動時のタブを選択できるようにしました。

version 1.2.0
時間のAM,PM表示時に、分を2桁表示に変更しました。
これにより、時間フォーマットを変えちゃったんでAM,PM表示を使用されていた方は再設定が必要です。ご面倒を掛けてごめんなさい。

あと、カスタムのListViewでオーバーライドしないとダメなメソッドで使用方法がわからなかったやつを"Not Supported"表示していたのですが、普通に使えてるとのコメントがありましたので表示を取り除きました。何に使用しているメソッドか未だわかってないので不安ですが 何か不都合がありましたらご連絡ください、よろしくお願いいたします。

通話履歴 S(Call History Simple) ver.1.0.5 ~ 1.0.7

version 1.0.5
カラーの選択数を増やしました。

version 1.0.6
アプリ起動時のタブを選択できるようにしました。

version 1.0.7
時間のAM,PM表示時に、分を2桁表示に変更しました。
これにより、時間フォーマットを変えちゃったんでAM,PM表示を使用されていた方は再設定が必要です。ご面倒を掛けてごめんなさい。

2011年6月13日月曜日

通話履歴 3D(Call History 3D) Ver.1.1.7

3Dビューを1種類増やしました。

追加したビューは、こんな感じのです。

2011年6月12日日曜日

android カラーピッカー?カラーセレクター? ダイアログ

カラーピッカーと言うのか、カラーセレクターと言うのかわからないけど、まあカラーが選択できるダイアログのコードを公開します。SSは、2.2バージョンのエミュレーターです。バージョンによってダイアログの色とか変わるんですねぇ(知らなかったですわ

※マーケットに上げているのは色選択数を変更しています。

独自で作っているので 変な書き方してる部分は多めに見てください。なんせ、動けばいいわ程度でかいてますから・・・
■/drawable(各シークバーのスタイル定義)
color_picker_seekbar_r.xml(赤色のシークバースタイル)
color_picker_seekbar_g.xml(緑色のシークバースタイル)
color_picker_seekbar_b.xml(青色のシークバースタイル)
■/layout(各レイアウト)
main.xml(適当なメイン画面)
dialog_picker.xml(シークバーがあるダイアログ)
dialog_selecter.xml(カラーパレットがあるダイアログ)
■/values(文字)
strings.xml
■/src(ソース)
ColorSelectDialog.java
■マーケットURI
https://market.android.com/details?id=jp.hiro711.ColorSelectDialog&feature=more_from_developer
マーケットに上げておきますんで、DLして使ってみてください。

まったくコメントないですが・・・そんなに大変なコードじゃないので大丈夫だと思います。
カラーセレクトダイアログも、AlertDialog.Builderで作りたかったんですがGridViewを使ったら選択後すぐにダイアログを破棄できなかったんで、こんな作りになってしまいました。
普通のListViewで、16色くらいからの選択ならArrayAdapterでアダプターを作ってgetViewをオーバーライドして背景を変えてやって、AlertDialog.BuilderのsetAdapterでやればリストのXMLを作らなくても簡単にできます。注意するところは、setAdapterのOnClickListener実装時にDialogInterface.OnClickListenerを実装してやって、onClick時の最後にdialog.dismiss()でダイアログ破棄してやるくらいかな。

color_picker_seekbar_r.xml
<?xml version="1.0" encoding="UTF-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@android:id/background">
    <shape>     
        <corners android:radius="5dip" />      
            <gradient          
                android:startColor="#ff000000"         
                android:centerY="0.5"         
                android:endColor="#ffff0000"         
                android:angle="0"     
            />    
        </shape>
    </item>
    <item android:id="@android:id/progress">
        <clip>
         <shape>
          <corners android:radius="5dip" />
          <gradient
           android:startColor="#ff000000"
           android:centerY="0.5"         
           android:endColor="#ffff0000"         
           android:angle="0"       
          />      
         </shape>    
        </clip>  
    </item>
</layer-list>


color_picker_seekbar_g.xml
<?xml version="1.0" encoding="UTF-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
 <item android:id="@android:id/background">
     <shape>     
         <corners android:radius="5dip" />      
            <gradient          
             android:startColor="#ff000000"         
             android:centerY="0.5"         
             android:endColor="#ff00ff00"         
             android:angle="0"     
            />    
        </shape>
    </item>
    <item android:id="@android:id/progress">
        <clip>
         <shape>
          <corners android:radius="5dip" />
          <gradient
           android:startColor="#ff000000"
           android:centerY="0.5"         
           android:endColor="#ff00ff00"         
           android:angle="0"       
          />      
         </shape>    
        </clip>  
    </item>
</layer-list>
color_picker_seekbar_b.xml
<?xml version="1.0" encoding="UTF-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
 <item android:id="@android:id/background">
     <shape>     
         <corners android:radius="5dip" />      
            <gradient          
             android:startColor="#ff000000"         
             android:centerY="0.5"         
             android:endColor="#ff0000ff"         
             android:angle="0"     
            />    
        </shape>
    </item>
    <item android:id="@android:id/progress">
        <clip>
         <shape>
          <corners android:radius="5dip" />
          <gradient
           android:startColor="#ff000000"
           android:centerY="0.5"         
           android:endColor="#ff0000ff"         
           android:angle="0"       
          />      
         </shape>    
        </clip>  
    </item>
</layer-list>
main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
 <Button android:id="@+id/changeTextColorButton"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:text="Change Text Color"
  />
 <Button android:id="@+id/changeBackgroundColorButton"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:text="Change Background Color"
  />
 <TextView android:id="@+id/sampleTextView1"
  android:layout_width="fill_parent"
  android:layout_height="40dp"
  android:gravity="center_vertical|center_horizontal"
  android:textSize="20dp"
  android:text="Sample1"/>
</LinearLayout>
dialog_picker.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
     android:padding="4dp"
   android:orientation="vertical">
    <TextView
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:paddingLeft="5dp"
     android:paddingRight="5dp"
     android:text="@string/color_picker_viewer"/>
    <TextView android:id="@+id/colorPickerViewer"
     android:layout_width="fill_parent"
     android:layout_height="40dp"
     android:layout_marginLeft="5dp"
     android:layout_marginRight="5dp"/>
    <TextView android:id="@+id/colorPickerTextR"
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:paddingLeft="5dp"
     android:paddingTop="5dp"/>
    <SeekBar android:id="@+id/colorPickerSeekBarR"
     android:layout_height="fill_parent"
     android:layout_width="fill_parent"
     android:max="255"
     android:padding="8dp"
     android:progressDrawable="@drawable/color_picker_seekbar_r"/>
    <TextView android:id="@+id/colorPickerTextG"
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:paddingLeft="5dp"/>
    <SeekBar android:id="@+id/colorPickerSeekBarG"
     android:layout_height="fill_parent"
     android:layout_width="fill_parent"
     android:max="255"
     android:padding="8dp"
     android:progressDrawable="@drawable/color_picker_seekbar_g"/>
    <TextView android:id="@+id/colorPickerTextB"
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:paddingLeft="5dp"/>
    <SeekBar android:id="@+id/colorPickerSeekBarB"
     android:layout_height="fill_parent"
     android:layout_width="fill_parent"
     android:max="255"
     android:padding="8dp"
     android:progressDrawable="@drawable/color_picker_seekbar_b" />
</LinearLayout>
dialog_selecter.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 android:orientation="vertical"
 >
    <GridView android:id="@+id/colorSelectGridView"
     android:layout_height="fill_parent"
     android:layout_width="fill_parent"
     android:verticalSpacing="6dp"
     android:horizontalSpacing="6dp"
     android:numColumns="4"/>
</LinearLayout>
strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">Hello World, ColorSelectDialog!</string>
    <string name="app_name">Color Select Dialog</string>
    <string name="color_picker_viewer">Color Viewer(Click to select 16Color)</string>
    <string name="color_picker_red">RED</string>
    <string name="color_picker_green">GREEN</string>
    <string name="color_picker_blue">BLUE</string>
</resources>
ColorSelectDialog.java
package jp.hiro711.ColorSelectDialog;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.GridView;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.SeekBar.OnSeekBarChangeListener;

public class ColorSelectDialog extends Activity {
    final int CHANGE_TEXT = 0;
    final int CHANGE_BACKGROUND = 1;

    final int COLOR_TABLE[] = {
        0xffffffff, 0xffc0c0c0, 0xff808080, 0xff000000,
        0xffffc0c0, 0xffff6060, 0xffff0000, 0xff800000,
        0xffffe0c0, 0xffffb060, 0xffff8000, 0xff804000,
        0xffffffc0, 0xffffff60, 0xffffff00, 0xff808000,
        0xffe0ffc0, 0xffb0ff60, 0xff80ff00, 0xff408000,
        0xffc0ffc0, 0xff60ff60, 0xff00ff00, 0xff008000,
        0xffc0ffe0, 0xff60ffb0, 0xff00ff80, 0xff008040,
        0xffc0ffff, 0xff60ffff, 0xff00ffff, 0xff008080,
        0xffc0e0ff, 0xff60b0ff, 0xff0080ff, 0xff004480,
        0xffc0c0ff, 0xff6060ff, 0xff0000ff, 0xff000080,
        0xffe0c0ff, 0xffb060ff, 0xff8000ff, 0xff400080,
        0xffffc0ff, 0xffff60ff, 0xffff00ff, 0xff800080,
        0xffffc0e0, 0xffff60b0, 0xffff0080, 0xff800040
    };

    int mColor = 0xffffffff;
    int mTextColor = 0xffc0c0c0;
    int mBackgroundColor = 0xff000000;

    LayoutInflater inflater;  
    View dialogView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        final Button button1 = (Button)findViewById(R.id.changeTextColorButton);
        button1.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                mColor = mTextColor;
                colorDialog(CHANGE_TEXT);
            }
        });
        final Button button2 = (Button)findViewById(R.id.changeBackgroundColorButton);
        button2.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                mColor = mBackgroundColor;
                colorDialog(CHANGE_BACKGROUND);
            }
        });
    }
   
    private void colorDialog(final int where) {
        final String rString = getResources().getString(R.string.color_picker_red);
        final String gString = getResources().getString(R.string.color_picker_green);
        final String bString = getResources().getString(R.string.color_picker_blue);

        inflater = LayoutInflater.from(this);  
        dialogView = inflater.inflate(R.layout.dialog_picker, null);
       
        final TextView textR = (TextView)dialogView.findViewById(R.id.colorPickerTextR);
        textR.setText(String.format("%s(%02X)", rString, (mColor & 0x00ff0000) >> 16));
        final TextView textG = (TextView)dialogView.findViewById(R.id.colorPickerTextG);
        textG.setText(String.format("%s(%02X)", gString, (mColor & 0x0000ff00) >> 8));
        final TextView textB = (TextView)dialogView.findViewById(R.id.colorPickerTextB);
        textB.setText(String.format("%s(%02X)", bString, (mColor & 0x000000ff)));
        final TextView viewer = (TextView)dialogView.findViewById(R.id.colorPickerViewer);
        viewer.setBackgroundColor(mColor);
        viewer.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                showDialog(0);
            }
        });
       
        final SeekBar seekBarR = (SeekBar)dialogView.findViewById(R.id.colorPickerSeekBarR);
        seekBarR.setProgress((mColor & 0x00ff0000) >>16);
        seekBarR.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
            int value = seekBar.getProgress();
            textR.setText(String.format("%s(%02X)", rString, value));
            mColor = (mColor & 0xff00ffff) | value << 16;
            viewer.setBackgroundColor(mColor);
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
            int value = seekBar.getProgress();
            textR.setText(String.format("%s(%02X)", rString, value));
            mColor = (mColor & 0xff00ffff) | value << 16;
            viewer.setBackgroundColor(mColor);
        }

        @Override
        public void onProgressChanged(SeekBar seekBar, int progress,
                boolean fromUser) {
            int value = seekBar.getProgress();
            textR.setText(String.format("%s(%02X)", rString, value));
            mColor = (mColor & 0xff00ffff) | value << 16;
            viewer.setBackgroundColor(mColor);
        }
    });
    final SeekBar seekBarG = (SeekBar)dialogView.findViewById(R.id.colorPickerSeekBarG);
    seekBarG.setProgress((mColor & 0x0000ff00) >> 8);
    seekBarG.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
            int value = seekBar.getProgress();
            textG.setText(String.format("%s(%02X)", gString, value));
            mColor = (mColor & 0xffff00ff) | value << 8;
            viewer.setBackgroundColor(mColor);
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
            int value = seekBar.getProgress();
            textG.setText(String.format("%s(%02X)", gString, value));
            mColor = (mColor & 0xffff00ff) | value << 8;
            viewer.setBackgroundColor(mColor);
        }

        @Override
        public void onProgressChanged(SeekBar seekBar, int progress,
                boolean fromUser) {
            int value = seekBar.getProgress();
            textG.setText(String.format("%s(%02X)", gString, value));
            mColor = (mColor & 0xffff00ff) | value << 8;
            viewer.setBackgroundColor(mColor);
        }
    });
    final SeekBar seekBarB = (SeekBar)dialogView.findViewById(R.id.colorPickerSeekBarB);
    seekBarB.setProgress((mColor & 0x000000ff));
    seekBarB.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
                int value = seekBar.getProgress();
            textB.setText(String.format("%s(%02X)", bString, value));
            mColor = (mColor & 0xffffff00) | value;
            viewer.setBackgroundColor(mColor);
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
            int value = seekBar.getProgress();
            textB.setText(String.format("%s(%02X)", bString, value));
            mColor = (mColor & 0xffffff00) | value;
            viewer.setBackgroundColor(mColor);
        }

        @Override
        public void onProgressChanged(SeekBar seekBar, int progress,
                boolean fromUser) {
            int value = seekBar.getProgress();
            textB.setText(String.format("%s(%02X)", bString, value));
            mColor = (mColor & 0xffffff00) | value;
            viewer.setBackgroundColor(mColor);
        }
    });
    final AlertDialog.Builder alert = new AlertDialog.Builder(this);  
    alert.setView(dialogView);     
    alert.setPositiveButton("OK", new DialogInterface.OnClickListener(){  
        @Override 
        public void onClick(DialogInterface dialog, int idx) {
            switch(where) {
            case CHANGE_TEXT:
                mTextColor = mColor;
                final TextView textView0 = (TextView)findViewById(R.id.sampleTextView1);
                textView0.setTextColor(mTextColor);
                break;
            case CHANGE_BACKGROUND:
                mBackgroundColor = mColor;
                final TextView textView1 = (TextView)findViewById(R.id.sampleTextView1);
                textView1.setBackgroundColor(mBackgroundColor);
                break;
            }
        }
    });  
    alert.show();
}

@Override
protected Dialog onCreateDialog(int id) {
    if(id == 0) {
        final String rString = getResources().getString(R.string.color_picker_red);
        final String gString = getResources().getString(R.string.color_picker_green);
        final String bString = getResources().getString(R.string.color_picker_blue);

        LayoutInflater inflater1 = LayoutInflater.from(this);  
        final View dialogView1 = inflater1.inflate(R.layout.dialog_selecter, null);
        
        final GridView gridView = (GridView)dialogView1.findViewById(R.id.colorSelectGridView);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,   android.R.layout.simple_list_item_1) {
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                View view = super.getView(position, convertView, parent);
                view.setBackgroundColor(COLOR_TABLE[position]);
                return view;
            }
       };
       for(int i = 0; i<COLOR_TABLE.length; i++) {
           adapter.add("");
       }
       gridView.setAdapter(adapter);
       gridView.setOnItemClickListener(new OnItemClickListener() {
           @Override
           public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                    long arg3) {
               mColor = COLOR_TABLE[arg2];
               final TextView textR = (TextView)dialogView.findViewById(R.id.colorPickerTextR);
               textR.setText(String.format("%s(%02X)", rString, (mColor & 0x00ff0000) >> 16));
               final TextView textG = (TextView)dialogView.findViewById(R.id.colorPickerTextG);
               textG.setText(String.format("%s(%02X)", gString, (mColor & 0x0000ff00) >> 8));
               final TextView textB = (TextView)dialogView.findViewById(R.id.colorPickerTextB);
               textB.setText(String.format("%s(%02X)", bString, (mColor & 0x000000ff)));
               final TextView viewer = (TextView)dialogView.findViewById(R.id.colorPickerViewer);
               viewer.setBackgroundColor(mColor);
               final SeekBar seekBarR = (SeekBar)dialogView.findViewById(R.id.colorPickerSeekBarR);
               seekBarR.setProgress((mColor & 0x00ff0000) >>16);
               final SeekBar seekBarG = (SeekBar)dialogView.findViewById(R.id.colorPickerSeekBarG);
               seekBarG.setProgress((mColor & 0x0000ff00) >> 8);
               final SeekBar seekBarB = (SeekBar)dialogView.findViewById(R.id.colorPickerSeekBarB);
               seekBarB.setProgress((mColor & 0x000000ff));
               dismissDialog(0);
           }
       });

       return new AlertDialog.Builder(this)
            .setView(dialogView1)
            .setNegativeButton("Cancel", null)
            .create();
       }
       return super.onCreateDialog(id);
    }
}

2011年6月9日木曜日

通話履歴 3D(Call History 3D) Ver.1.1.5 ~ 1.1.6

version 1.1.5
日付の年表示に対応

version 1.1.6
日付を年表示できるようにしてしまったんで 1行で表示しきれなくなってしまっていたので、文字の横幅を変更できるようにしました。

通話履歴 S(Call History Simple) ver.1.0.3 ~ 1.0.4

version 1.0.3
年表示に対応した際に、フォーマットをちょこっと修正したもんで、そのフォーマットを選択していたら、そのフォーマットを確認できなくて強制終了してしまうという、お粗末なアップデートだったので、確認できない場合は初期値に戻すようにしました。

version 1.0.4
通話時間を日時の横に(000:00)で表示できるようにしました。設定で通話時間表示にチェックで表示されます。
999分を越える場合 (999:99)と表示されます。
あと、よくわからないんですが データベースに-1秒となってるときがあったんでとりあえず(***:**)と表示するようにしておきました。

2011年6月7日火曜日

デジクロッくん ver 1.1.1

今回 バージョンが一気に上がってますが、Demo版と合わせただけです。

とりあえず、フォント関係のバグを出来る限り取り除いてみました。

あと、使いづらかった文字サイズ画面のシークバーをボタンで隠してみました。これで イライラは減ると思います。

通話履歴 S(Call History Simple) ver.1.0.2

日付フォーマットに年表示を追加しました。(通話履歴 3Dにも 追加予定)
広告表示がバージョンアップしたので最新版を使用してみました。(無駄な通信を防げるそうです)

次のアップデートで 通話時間(000:00)の表示ON/OFF機能を追加します。
ただ、今『デジクロッくん』のアップデートをコーディング中なんで少し時間かかります。

2011年6月6日月曜日

『デジクロッくん』 次回アップデート予定

SDにフォントを入れて表示フォントに設定したまま、SD内のフォントを消去すると強制終了で、設定データ等を消去しないと設定画面すら立ち上がってくれないバグがあったので修正します。
USB接続でマウントした場合も、マウント中にSDからフォントを読み込めないので、強制終了していたのも修正。

ファイルが読み込めなかったら、標準フォントで描画し次回描画時(分が変わったとき)に読み込める状態であれば表示しなおします。

サイズ設定のところのシークバーが誤操作しやすいので、ボタンをおしたらシークバーが表示されるように変更します。

デモ版も、製品版と同じように修正します。

今週中には 両方アップできるように頑張ります。

2011年6月1日水曜日

デジクロッくん ver 1.0.2

あんまり売れてないせいか、エラーがまったく報告されておりませんでしたが、ゲームを使用中に強制終了したとのご連絡がありました。
エラーの内容的には、
1.メモリーを食うアプリができたので androidのOSがデジクロッくんを終了させる
2.アプリが終了してしまうので、データが破棄される。
3.OSがサービスを再起動させるか、alarmManagerがサービスを再起動させる
4.設定データの読み込みをしないまま、描画処理を行う。
5.もちろん、Nullポイント エラーが発生して 強制終了となる。

対策
1.サービス内のonCreateで、データの読み込み

サービスのonCreateは、サービス作成時に一回しか読み込まないはずなのでこれでいけるかな・・・

同じ状況にできないので、Task kill系のアプリを使って デバッグしてみたところ うまくいってるみたいだったので、マーケットにアップしました。

この変更で他のエラー出ませんように(ドキドキです・・・

2011年5月30日月曜日

『通話履歴 S(Call History Simple) ver.1.0.1』公開しました

https://market.android.com/details?id=jp.hiro711i.CallHistorySimple

焼きまわしみたいなもんなんで、さくっとマーケットにアップしました。

通話履歴 3D(Call History 3D) Ver.1.1.4

今回のバージョンアップは、追加機能はありません。
アイコンを作り直しただけです。前より、かっこよくなったと自分では思ってます


これが、アプリアイコン

発信履歴

着信履歴

不在着信

『通話履歴 S』 ってのを出すのよ

また、通話履歴って感じなんだけど、3Dの方は見た目にこだわったんで たぶん動かない機種もあるのだと思います。あと、見た目はどうでもって人もいるだろうということで 見た目シンプルというか普通のListViewを使用したのを作ります。
で、リストのレイアウトを少し いじれるようにしてます。
文字の大きさと色だけですけどね。

んで、文字の大きさをSeekBarで変更できるようにしたんです(下のように・・・
まあ、みごとに使いづらいです。下にスクロールしようとすれば SeekBarにあたってしまい イライラします。
つうことで、ボタンを押したら隠すボタンとSeekBarを表示して変更できるようにしてみます。
こんな感じで出来上がった

2011年5月27日金曜日

通話履歴 3D(Call History 3D) Ver.1.1.3

今回のアップデートで、文字の色とドロップシャドウ(影付)ON/OFF 色 文字からの距離を変更できるようにしました。
あと、最適化をしましたので機能は増えたけどアプリのサイズは小さくなりました。(微妙に速度も上がってます
変更方法は、変更ボタンを押すとダイアログが出ますのでそれで変更してください。

ついでにカラーダイアログがスライダーでの変更のみだったのを、ダイアログのカラービューアー部分をクリックすることで、16色の中からの選択ができるようにしました。


今週金曜日の夜中にアップしますんで、土曜日にはダウンロードできると思います。

2011年5月24日火曜日

通話履歴 3D(Call History 3D) アップデート内容(予定)

英語で、テキストの色の変更ができないか!見えにくくてしかたないぞ!!(実際はもっと優しい感じでしたけど
という内容のメールが届きましたので、対応してみます。次回アップデートに間に合わないかも知れませんが・・・
まあ、白色なんで背景を白ぽいのを選んだら見えにくくなるんだろうと想定して、ドロップシャドウは付けてたんですが、やはり見えにくいですよね。

ということで、次か次の次でのアップデートで
・文字の色
・ドロップシャドウのON/OFF
  ドロップシャドウの色
  ドロップシャドウ距離

の機能をつけます。
あと・・・広告無しバージョンなんですが もう少しアプリ利用者数が増えたら考えます。(金額が悩ましいんです;;

2011年5月23日月曜日

Eclipse ProGuardで最適化

最近知ったのですが、Javaコンパイラは、Cと違って最適化をしてくれないそうです。
私が、C言語を使っていた20年前くらいでも最適化をしてくれていたのにJavaしてくれないそうです。
正確に言うと、最適化をしてくれてるみたいだけど まったく期待できない糞仕様らしいです。
じゃあ、コード段階で最適なコードを書けばいいって話ですが そうすると非常にだらだらと長くなったりと 考えるのが面倒なのでしたくありません。
そこで、最適化ツール『ProGuard』の出番です。
Javaの最適化が期待できないと知って、ProGuardって最適化ツールがあることは知ってたんですが コマンドラインから方法しかできないから面倒だなと思って手を付けておりませんでした。
しかし、android SDKのr8(android 2.3)から標準装備されていたんです!
EclipseのPackageExplorerでパッケージを展開すると、一番下にProguard.cfgなるものがありました。(毎日見ているのにまったく気がつかなかった)
だけどですね・・・勝手に作ってきているのに適応はされてません。
最適化された apkを作るには、default.propertiesの最後に

proguard.config=proguard.cfg

を書き加えて、後はいつも通りにakpを作れば ほらっ最適化された!!!というわけです。
あとは、proguardってフォルダが出来ているんで そいつをバージョン管理につっこんでやります。
(中身が、毎回上書きされるらしいんで)
詳しくは、proguardで検索して頂くと 他の人が詳しく書いてあるので呼んでください。

ちなみに、最適化するのはapkを作るときですので、通常のデバック時(Eclipseかのら実行)では最適化できてませんので お間違いなく。

ということで、今週は最適化したバージョンをマーケットにアップします。

2011年5月21日土曜日

通話履歴 3D(Call History 3D) Ver.1.1.2

ギャラリーから背景を設定するとき、大きな画像を選択してBitmapのOutOfMemoryが発生していたのを修正しました。
修正内容的には、画像の大きさを640x480ぐらいにスケールダウンして取り込むようにしました。

通話履歴 3D(Call History 3D) Ver.1.1.1

今回のアップ内容は、どうでもいいような機能かも知れませんが
スクリーンがONになった時とロック解除をした時に、未確認の不在着信があったらアラートを数秒表示します。
ロック画面のままだと表示されません。ロック画面をすばやく解除しちゃうと、2回表示しちゃいます。
このアプリでは、未確認を確認済みにしません。(したほうがいいのかなぁ?
アラートのON/OFFは設定画面で切替できます。
アラート表示の不在着信ってとこです。(チェック有りでON 無しでOFF)

2011年5月11日水曜日

通話履歴 3D(Call History 3D) Ver.1.1.0

今回は、設定画面を追加しました。
設定画面で、描画モード(3D,ノーマル) 背景の選択(現在の壁紙,画像ギャラリー,指定色)
と、日本人にはあんまり関係ないと思いますが日時書式の選択(秒表示付きも)が可能になりました。

自分が持ってる実機(IS03)では、試してるんですが・・・
もうしかしたら、わけわかんないバグ等でるかもしれないので 出たら教えてください。
最初から起動しないとかもあったら機種等を教えてほしいです。ご面倒をかけることになってすいません。

2011年5月7日土曜日

通話履歴 3D(Call History 3D) 次回アップデート予定

背景が変更できないか?といこうとで変更できるようにしてみようと思います。
ただ・・・どう変更すればいいんだろうか
わかんないから とりあえず目指すは、指定色(16色)くらいからかカラーピッカーで設定できるようにしてみようかな・・・
できそうなら、イメージギャラリーもつけて見るかな

どちらにしろ、少しお時間を下さい。

2011年5月5日木曜日

通話履歴 3D(Call History 3D) Ver.1.0.5

強制終了が何をしたら、起こってるのかがわかってないんです。
何故、起こるのはわかってるんですが、何をしたらそのメソッド(getSelectedView)が呼び出されてるのかがわかんない。
とりあえず、メソッド内で例外を投げるようにしていたのを 戻り値をnullにしてトースト表示にしてみました。

余計に悪くなってしまうかもという不安がありますが、一回マーケットにアップします。

強制終了した場合もしくは、『Not Support』ってトーストが表示されたら、何をしてたらなのかを教えていただければ非常に助かります。
『糞アプリ!!死ね!!』と書かれてもねぇ・・・

2011年5月1日日曜日

通話履歴 3D(Call History 3D) Ver.1.0.4

クラッシュ エラーを修正しました。
公衆電話・非通知でクリック(音声発信、SMS送信)できてたのを 出来ないように変更しました。
ロングプレスでの、1件削除はそのままできます。

国際電話のことを考えていなかった。とりあえず、その部分を削除、例外処理で、いい方法がわかったら復活させます。

2011年4月30日土曜日

通話履歴 3D(Call History 3D) Ver.1.0.3

すいません、アホなミスをしてました。

桁数オーバーで、強制終了していましたのでそこを直しました。

通話履歴 3D(Call History 3D) Ver.1.0.2

電話帳に登録されていない場合、ロングプレスで登録できるようにしました。
新規登録と追加登録から選べます。
ただ、登録してもすぐに通話履歴に反映されないみたいです。(もしかしたら、新しいデータしか反映されないかも)
このアプリは、表示の時に本体にある通話履歴からデータを取得するんで、andoroido本体のデータが更新されないとダメなんです。

あと、エラーレポートが1件上がってましたが、原因がまったくわかりませんというか何をしたらそうなるのかがわかんない;;はふん

2011年4月29日金曜日

2011年4月28日木曜日

通話履歴 3D (Call History 3D) 一応完成

ゲームばっかりやってて、全然すすんでなかったんですが やっと形になりましたのでマーケットに公開します。

https://market.android.com/details?id=jp.hiro711i.CallHistory3D&feature=search_result


通話履歴を表示するアプリです。
メニューで、シンプル表示と3D表示の切替ができ、表示されているタブの全件削除ができます。
クリックで、発信とSMS送信が選択できます。
ロングプレスで、1件削除および、電話帳に登録されている場合電話帳を開けます。
背景は、設定されている背景を取得し表示します。

ウィジェットに発信履歴と着信履歴のボタンがありますので、ホーム画面に設置してお使いください。

2011年4月18日月曜日

『通話履歴 3D』 途中経過

とりあえず、リストのとこだけ作ったんで公開してます。

オリジナルのListViewですんで、バックグランドには背景を使用するようにしてます。

実用性よりグラフィカルを選んでますので、あしからず。

2011年4月15日金曜日

次なるアプリは、着発信信履歴です。

まあ、普通のタブとリストビューで簡単に作れるんじゃないかな・・・

通話ログは、getContentResolver().query()を使えば取得できるらしい。

で、今何をしてるかと言いますと通話ログの取得は無視してリストビューを ごにょごにょといじってます。

自作のMyListVIewクラスを作って、3Dぽいアニメーション付きで表示できないかなとやっております。3Dアニメーションといっても いろいろやるとごちゃごちゃでリストとして意味ないから、ちょっこちょこっとね。

リストのイメージ的には、ガラス板に文字が書かれるみたいな感じにしたいが、ガラス板を描画できませんので、それっぽく(ただ、透過しただけみたくなったが

もう少し、見れそうな感じにしあがったらUPしますね

2011年4月4日月曜日

『デジクロッくん』製品版を公開しました。

下記アドレスで公開してみました。よろしくです
https://market.android.com/details?id=jp.hiro711i.DigiClocKun&feature=search_result

デモ版よりは、安定してます。

文字の縁取り方法

テキスト文字の縁取り方法を書いておきます。
と言っても、TextViewでの書き方はわかりません。android.text.styleをざっと見たところできそうになかったけど、何か方法があるのかも知れませんね。(これを使うと、エンボス加工とか、横倍率とか部分的に背景色を変えるとかは出来るみたいです)

で、今回は文字の描画(イメージテキスト?)まあ、drawTextでの書き方です。
方法は、setStyleでStyle.STROKE(輪郭線を描く)を使うだけ・・・
縁取りはExcelみたいな感じに縁を中心に膨らんでいく感じなんで中の文字の大きさを変えたくない場合は、
Paint paint = new Paint();
paint.setAntiAlias(true);

paint.setStrokeWidth(2.0f);
paint.setColor(Color.BLACK);
paint.setStyle(Paint.Style.STROKE);
canvas.drawText("テスト", xPos, yPos, paint);

paint.setStrokeWidth(0);
paint.setColor(Color.WHITE);
paint.setStyle(Paint.Style.FILL);
canvas.drawText("テスト", xPos, yPos, paint);
setStrokeWidthで、縁取り幅を決めて
setColorで、縁取りの色を決めて
setStyle(Paint.Style.STROKE)で、図形の輪郭線のみを描くに設定して
drawTextで、一回文字を書く
setStrokeWidthで、縁取り幅を0に戻して
setColorで、文字色を決めて
setStyle(Paint.Style.FILL)で、図形の内側を塗りつぶすに設定して
drawTextで、もう一度文字を書く

と言う、なんかもったいない処理をしています。
先に内部文字を書けば、縁取り幅を広くすると内部の文字が縁取りに押しつぶされる感じですね。
setStrokeColorというメソッドがあれば、一発で済むのになぁ

もっと、いい方法がありそうだけど初心者の私にはこれしかわかりません。

そうそう、drawTextとかイメージ描画は単位がpx(ピクセル)なんで自動で画面いっぱいに書く場合、解像を考えて書かないとぼやけた文字になっちゃいます。

簡単にpx→dip計算をするなら、
getResources().getDisplayMetrics().densityで、解像度比率(?)を取得して乗算してあげるといいですよ。

2011年3月31日木曜日

『デジクロッくん』製品版 予定

そろそろ、マーケットに出したいと思ってるんですが、お値段は100円くらいで!
まあ、100円の価値もないかも知れんけどね!

機能は、デモ版と同じです。後は、フォントを集めなおして(ライセンス等の関係)パックしなおしますんで、デモ版より数は減ると思います。
SD内のフォントもパッケージフォルダ内に取り込む予定だったけど、よくよく考えたら追加していくと、どんどん膨れ上がるので、SD内フォントはそのままSDから呼び込む仕様にします。削除機能付ければいいのでは、と思うんだけど使ってる人が削除してくれるとはかぎらないんで・・・

100円だし、この程度のアプリか・・・と我慢できる人は購入してみてください。
今後は、バグが発生したら対処できるものは対処
機能追加の要望で可能なものは、追加

そんなとこです。

2011年3月29日火曜日

なんでだろ

昨日フォントのせいで、スピナーがメモリを食って見たいないこと書いたが・・・
スピナー自体がメモリーを食ってるみたいです。

生成方法間違ってるかな とほほ

と、思ったけどスピナーとは そうゆうものなのかも知れない

2011年3月28日月曜日

外部フォントの取り込み

androidで外部フォントを取り込む場合 assetsフォルダにフォントファイルをぶち込んで、createFromAssets(getAssets(), "フォント名.拡張子")を使うんですがこいつを描画毎に呼び出すと、なぜかメモリーをどんどん食い尽くしていく。
そして、なぜかcreateFromFile("フルパス+フォント名.拡張子")で やるとメモリーを食わない。

なぜなんだろ~ getAssets()が、contextを掴んで 開放できないんだろうか・・・
う~ん わかんねぇ

とりあえず、今回のアプリはSDからも読み込むということで フォントファイルを全てfilesフォルダにコピーしてcreateFromFileで、読み込むことにした。
描画では、メモリーリークしなくなったけど、スピナーの表示でメモリーリークしてるから もう少しコードを見直しだわ

2011年3月23日水曜日

『デジクロッくん(Demo.)』を マーケットにUP予定

ホーム画面に置く時計ウィジェットです。
ウィジェットを配置して、タップしますと設定画面が開きます。
デモ用ですので、10分で基本設定表示に戻ります。
(変更した設定は保存されてますので、再度設定画面に戻すと表示し直されます)
フォントは、SDカード内にフォントファイル(TTF,OTF)があれば全て読み込みします。
デモ用に、いつくか入っておりますがお好きなフォントをSDカードに保存してご利用できます。

■注意事項
 全てのandroid端末に対応しているものではございません。
 フォントは、表示できない物もございます。
 ウィジェットが完全に表示されてない時は、設置したと思われる箇所をタップして設定画面を再度表示してみてください。
 画像処理及び、AppWidgetの性質上、時間が更新されない時があります。
 正確な時刻を表示するものではありませんので、ご了承ください。

■ 時間/時計 設定項目
 ・表示 ON/OFF
 ・表示形式
 ・表示する基準位置
 ・フォント
 ・文字色
 ・影付き ON/OFF
 ・影の色
 ・文字との距離
 ・縁取り ON/OFF
 ・縁取りの色
 ・縁取り幅
■ サイズ 設定項目
 ・基本サイズ
 ・横方向の伸縮
 ・表示位置微調整(縦・横)
■ 特殊効果 設定項目
 ・効果適応箇所選択
 ・エンボス ON/OFF
 ・エンボスぼかし量
 ・テクスチャー ON/OFF
 ・テクスチャー選択
 ・文字透過率

2011年3月18日金曜日

デジタル時計Widget『デジクロッくん』を作ろう

最初に作るアプリとして、デジタル時計widgetを作ろうと思います。

アプリの名前は、『デジクッロくん』 
いろいろ、カスタマイズできるように頑張る!!!で、作り始めて・・・正直初めてのアプリではないなと思いました。
が、しかし やり始めたからには一応形にします!

現在できる設定
・文字色(16色)を変更可能
・フォントを変更可能(フォントは、SDカードから読込み可能にする)
・ドロップシャドウ機能 色と文字からの距離を変更可能
・縁取り 色と縁取り幅を変更可能
・文字サイズ、横方向への拡大、描画位置の微調整(縦横可)を変更可能
・エンボス加工、文字へのテクスチャーの貼り付け可能
・文字の透過率を変更可能
ほぼ、時計と日付でそれぞれ設定できます。
こんな、感じです。

で、今は 非常に使いづらい設定画面を作っています。

2011年3月14日月曜日

SDからのフォントファイル読み込み

SDカードの\fontsフォルダー内からフォントファイルを取得する方法
ArrayList fontFile = new ArrayList();
String stateSD;
// SDカードがマウントされてるかの確認
stateSD = Environment.getExternalStorageState();
if(Environment.MEDIA_MOUNTED.equals(stateSD)) {
    // フォントファイルが格納されているディレクトリを設定
    File file = new File(Environment.getExternalStorageDirectory().getPath() + "/fonts");
    // ディレクトリ内のファイルを取得
    String fileName[] = file.list();
    for(int i = 0; i < fileName.length; i++) {
        // ファイル名を取得
        File selectName = new File(file.getPath() + "/" + fileName[i]);
        // フォントファイル(ttf,otf)を選別
        if(selectName.getName().endsWith("ttf") || selectName.getName().endsWith("otf")){
            fontFile.add(file.getPath()+"/"+fileName[i]);
        }
    }
}
SDカード内の全てのフォルダー内からフォントファイルを取得する方法
ArrayList folderList = new ArrayList();
ArrayList fontFile = new ArrayList();
String stateSD;
// SDカードがマウントされてるかの確認
stateSD = Environment.getExternalStorageState();
if(Environment.MEDIA_MOUNTED.equals(stateSD)) {
    // ルートディレクトリを取得
    File file = Environment.getExternalStorageDirectory();
    // ルートディレクトリをfolderListに追加
    folderList.add(file.getPath());
    for(int i = 0; i < folderList.size(); i++) {
        // フォルダを設定
        File subFolder = new File(folderList.get(i));
        // フォルダ内のフォルダ・フィル名を取得
        String selectName[] = subFolder.list();
        for(int j = 0; j < selectName.length; j++) {
            // フォルダ・ファイルを1つづつ設定
            File subFile = new File(subFolder.getPath() + "/" + selectName[j]);
            // 設定された項目がフォルダか判別 フォルダならfolderListに追加/目的のファイルならファイルリストに追加
            if(subFile.isDirectory()) {
                folderList.add(subFolder.getPath() + "/" + selectName[j]);
            }
            else if(subFile.getName().endsWith("ttf") || subFile.getName().endsWith("otf")) {
                fontFile.add(subFolder.getPath() + "/" + selectName[j]);
            }
        }
    }
}
この方法だと、フォルダーに何も入ってない場合selectName.lengthで、例外が発生するかなぁ・・・
try~catchで、例外処理をした方がよさそう。

2011年3月13日日曜日

とりあえず

Androidアプリ用にブログを作ってみた 。

使い方がよくわからんが、まあ なんとかなるでしょう。

便利そうなら、ゲーム用のブログもこっちにもってこようかなっと