2014年2月22日土曜日

Android:SeekBarの扱い方

こんにちは

前回enchant.jsの記事を書いておいてなんですが今回はAndroidの話
あっちいったりこっちいったりです。ふらふらです。

では、タイトルの通りSeekBarの扱い方について、今までSeekBarは使ったことがなかったので基本的な使い方になります。

やりたかったことは、フォントの調節をSeekBarで行う感じ。


とりあえず,xmlのレイアウトファイルは次のように

<seekbar 
  android:id="@+id/fontSeekBar" 
  android:layout_height="wrap_content" 
  android:layout_margintop="50dp" 
  android:layout_width="match_parent" 
  android:max="10" android:progress="10">
</seekbar>

<textview 
  android:id="@+id/fontSize" 
  android:layout_gravity="center_horizontal" 
  android:layout_height="wrap_content" 
  android:layout_width="wrap_content" 
  android:text="フォント:○○" 
  android:textsize="18sp">
</textview>

フォントの調節に使うので確認用にTextViewも載せます。
で,ソースコードはこんな感じ

SeekBar seekBar;
TextView textView;
seekBar = (SeekBar)dialog.findViewById(R.id.fontSeekBar);
textView = (TextView)dialog.findViewById(R.id.fontSize);

seekBar.setOnSeekBarChangeListener(new SeekBarChangeListener());  

SeekBarChangeListenerはこちら
class SeekBarChangeListener implements OnSeekBarChangeListener{
  @Override
  public void onProgressChanged(SeekBar seekBar, int progress,
    boolean fromUser) {
   //つまみをドラッグしたとき
   textView.setText("フォント:"+seekBar.getProgress());
  }

  @Override
  public void onStartTrackingTouch(SeekBar seekBar) {
   //つまみに触れたとき
  }

  @Override
  public void onStopTrackingTouch(SeekBar seekBar) {
   //つまみを離したとき
  }
 }

onProgressChangedの中でSeekBarの値を取得しTextViewに反映させてあげればseekBarの変化とtextViewが連動して見栄えがよくなります。 基本的にseekBar.getProgress()で現在の値を,setProgress()で値をセットしています。そんな難しくない。 気になったのは,値の設定方法。
xmlのandroid:max
とい項目はあってこれで最大値は決められるらしいのだが
最小値を設定するパラメータはない・・・・
え?なんで?って思ったんだけどなんかなさそう。
SeekBarの最低値は0なんだけどフォントサイズ0で設定するわけにもいかないので配列使って変換することにしました。
こんな感じに


//フォントで設定できる値
 private static int Font[] = {8,12,14,16,18,20,22,24,28,32,36};
 

これでSeekBarを10段階に設定(max=10)して対応させてあげました。
最小値と最大値は下の画像のようになりました。



2014年2月7日金曜日

tl.enchant.js

久しぶりのブログになります。学生なので、春休みに入りました。やったね。


最近扱ってるのがenchant.jsというゲームエンジンを利用した開発なので,そっちの方もちょいちょい書いていきたいと思います。(というかAndroidをあんま触っていない...)

一年ぶりにenchantを触ってリハビリしていたのですが,便利と名高い(?)tl.enchant.jsをようやく使い始めました。アニメーション用のライブラリです。え?去年enchant扱い始めた頃はまだ知らないライブラリ恐怖症だったのですが,使っておけばよかった。

めっちゃ便利です。びっくりした....

ということで概要を僕なりに書いていきます。

まず,enchant.jsを使った通常の書き方
enchant.jsではフレーム数という一秒辺りのコマ数が設定できます。
で,配置したオブジェクトを動かすにはオブジェクトに1フレーム毎の挙動を設定してあげなければなりませんでした。これがめんどくさかった。
例えば,下の画像のようなクマ(変数bear)を左から右へ動かすにはフレームごとに
bear.addEventListener(Event.ENTER_FRAME,function(){
    this.x+=3;
  });

のような記述をしなければなりませんでしたし,画面右で止める・左右に動かすなどの動きにはfor文やif文による制御も必要でした。


これがtl.enchant.jsではすっごく簡単にできるのです。すっごく簡単にできるのです。(大事なことなのでry

bear.tl.moveTo(250,100,32);

これだけ。イベントリスナーも細かい制御もいりません。
.moveTo(x,y,f)はx,yが目標の座標,fがそこまで何フレームかけて進むかを指定しています。
クマの初期位置が(0,100)であったとすると上記のソースだけで画面右へクマが移動します。
左右に動かしたい時も関数を繋いでいけばいいだけ。

bear.tl.moveTo(250,100,32).moveTo(0.100,32).loop();

関数を繋いでいくとキューのように関数が溜まっていき順次実行されます。最後のloop()でその一連の動作を繰り返します。
この動作を実現させるのに去年どれだけ苦労したか・・・物悲しいですね。無知は罪だ。


2013年12月31日火曜日

DialogFragmentから特定のActivityへのコールバックメソッド

アクティビティから生成したダイアログフラグメントで呼び出し元のアクティビティのメソッドを実行したい。値の受け渡しとかしなきゃいけないのかなーとか思っていたら案外簡単に出来ました。 呼び出し元のアクティビティをMainActivity,呼び出したいメソッドをcallback()とすると
MainActivity activity = (MainActivity)getActivity();
activity.callback();
//ダイアログフラグメントの消去
dismiss();
これだけ。getActivity()だと特定のクラスを指定しなきゃいけないじゃん、とか思ったけれどもキャストしてあげれば何の問題もありませんでした。これをフラグメントを解消する前に記述してあげればコールバック(のようなもの?)ができます。

2013年12月18日水曜日

URLスキーム設定

ブラウザのリンクからアプリを呼び出すURLスキーム,iOSでは簡単に実装できるそうですがAndroidでは地味にめんどくさかったです。二種類ほど方法を説明します。

1.アプリがインストールされている場合のURL設定
AndroidManufest.xmlのURLから起動したいアクティビティに以下のインテントフィルタを追記します。

<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE"/>
<data android:scheme="hogehoge" android:host="android" />
</intent-filter>

ブラウザから上記のように設定したアプリを開くときは,以下のようにHTMLタグを設定します。

<a href="hogehoge://android">テストリンク</a>
しかしこれはアプリが端末にインストールされている場合のみ有効なようです。インストールされていない場合はGooglePlayに飛ばすとかできるのが理想なんですけど、わからず。そこで,代替案が次の方法になります。

2.アプリのインストール有無にかかわらずGooglePlayへ飛ばす
タイトルそのまんまです。インストールされている場合はそこからアプリを開けるし,まだインストールしていない場合はダウンロードできる。これが僕が調べた中では都合が良さそう。
ブラウザのURLは以下のように設定します。スキームは上記のAndroidManifest.xmlと同様とします。
<a href="intent://scan/#Intent;scheme=hogehoge;package=アプリのパッケージ名;end">GooglePlayへのリンク</a>
これであればアプリをインストールしているかにかかわらずユーザを目的のアプリへ誘導できます。多少の難は残りますが。

2013年12月11日水曜日

EditTextのキーボードを表示する

EditTextのキーボードの表示させる方法について記述します。

以下のメソッドを利用すれば表示できるみたいです。
getWindow().setSoftInputMode(WindowManager.LayoutParams
.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

ちなみにダイアログ・フラグメントダイアログなどではそのクラスのgetWindow()メソッドを使用してあげれば良いようで。(dialog.getWindow(・・・)という感じ)

2013年12月6日金曜日

TeraTerm,WinSCPによるSSH転送

WinSCPとTeraTermの二つそれぞれからサーバーをひとつ経由して目的のサーバーへ接続する方法を調べたので記載。

自分のPC→サーバーA→サーバーB というようにサーバーAを経由してBに接続する場合を考える。


1.WinSCPによるトンネルを利用した接続

最初に,新規のセッションを開きサーバーBのホスト名,ポート番号等を入力する

次に左の設定におけるトンネルの項目を選択。以下の画面が表示されるので経由するサーバーAの情報を入力する。



2.TeraTermの場合

TeraTermを起動すると「新しい接続」と出るがそこをキャンセルし,メニューの設定→SSH転送を選択する。
出てくるSSHポート転送の追加を選択すると次のような画面が現れるので,以下の値を設定する。
ローカルのポート:任意(使用されていないポートならなんでも良い)
リッスン:空白
リモート側ホスト:接続するサーバーBの情報
リモート側ポート:(Aを経由して)接続するサーバーBのポート


これでOKを押し設定画面をとじたあと,サーバーAに接続する。
サーバーAに接続したあと,そのウィンドウを開いた状態で新しくTeraTermを起動しlocalhostで接続する。その際ポート番号は上で指定したローカルのポート番号を使用する。
その後下のように通常のSSH認証画面が表示されるのでサーバーBのユーザー名・パスワードを入力してあげれば良い。




MySQLのデータ移行

MySQLのDB移行についてやり方のメモ

エクスポートのコマンド
mysqldump -u MySQLのユーザー名 -p データベース名 > databese.sql

パスワードが求められるのでデータベースのパスワードを入力すると現在いる場所にデータがエキスポートされる。

インポートする際はローカルに落として移行先のサーバに接続、コピー。空のデータベースを作成してインポートした

インポートのコマンド
mysql -u MySQLのユーザー名 -p 新データベース名 < database.sql


尚拡張子はsqlだろうがlogだろうが大丈夫らしい。データベース名も新旧で一致している必要はなかった。