ノンプログラマー・プログラミング・ガイド

ほぼ独学。もはやおっさんになりかかってからプログラミングの勉強開始。HTML、CSS、JavaScript、SQL、PHP、Javaがなんとなく解る。Joomla!とandroidで書いたプログラムを配布中。iPhoneアプリ作りたいからMacくれ(下さい)。

タグ:android

Androidで、一定時間の後に実行したいコードがある場合の書き方です。俗称でdelayとか言われるメソッドかと。まんまか・・・・。遅延メソッド?よくしりません・・・。作成方法は、簡単でhandlerを作って、handlerのpostDelayedメソッドを使用します。引数には、runnableです。


final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
	@Override
	 public void run() {
		 //ここにかく
	}
 }, 500);
 上記のサンプルコードでは、500ミリ秒後(0.5秒後)に、run内のコードが実行されます。

 

AndroidのアプリでActivityを呼び出すときのアニメーション(画面変移)を設定する方法です。何も設定しない場合は、Intent使ってActivityを呼び出したときは、ブワッっと前にでてくるアニメーションなんですけど、横にスライドしたり、透過させたりのアニメーションに変える事も可能です。このメソッドは、Activity自体に適用させるメソッドです。画面内のViewなんかに適用させるアニメーションではありません。


使うメソッドは、これ。
overridePendingTransition ( R.anim.in_anim, R.anim.out_anim);
ActivityでIntentを呼び出した後に、上記のコードを呼び出します。


NextActivityを呼び出してアニメーションを適用したい場合は、インテントを呼び出した後で、こんな感じにoverridePendingTransitionを使います。
Intent i = new Intent(this, NextActivity.class);
startActivity(i);
overridePendingTransition ( R.anim.in_anim, R.anim.out_anim);
この場合、NextActivityはin_animで設定したアニメーションが適用され、Intentを呼び出したクラスには、out_animが適用されます。


animの設定

アニメーションはxmlファイルで指定します。overridePendingTransitionで渡した引数がアニメーションが書かれたxmlのファイルです。で、xmlは、resの配下にanimフォルダー内に設置します。animフォルダーがresフォルダーの配下にない場合は、animとフォルダー名を指定して、フォルダーを新規作成してください。


下記のサンプルのアニメーションは、新しいActivityを右らから左にスライドさせて、古いActivityを元の位置から左側に追い出してます。

in_anim.xml
<set xmlns:android="http://schemas.android.com/apk/res/android">     
  <translate android:fromXDelta="-100%p" android:toXDelta="0" android:duration="200"/>
</set>  
横(X)方向の位置を右側(-100%p)において、Xの位置を元の場所(0)に戻すアニメーションを設定しています。


out_anim.xml
<set xmlns:android="http://schemas.android.com/apk/res/android">  
  <translate android:fromXDelta="0" android:toXDelta="100%p" android:duration="200"/>
</set>  
左側に抜けていかせたいので、元の位置から画面一個分(100%p)左側に移動させてます。


*呼び出したActivityから元のActivityに戻るときにもアニメーションを設定したい場合は、呼び出したActivity側でもoverridePendingTransitionを設定してやる必要があります。


使えるアニメーションのタグ

translateは、移動させるアニメーションを定義しているんですが、察するに、多分この辺(Animation Resources : View)のアニメーションのタグが使えるんじゃないのかと思います。

  • alpha : 透過
  • translate : 移動
  • rotate : 回転
  • scale : 拡大・縮小


複数のアニメーションを適用することも可能

たとえば、translateとalphaとrotateを組み合わせたりってこともできます。

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">  
	 <scale 
	     android:fromXScale="1.2" 
	     android:fromYScale="1.2"
	     android:toXScale="1.0" 
	     android:toYScale="1.0"
	     android:pivotY="0.0" 
	     android:pivotX="0.5" 
	     android:duration="300" />      
    
	 <translate 
	     android:fromXDelta="100%p" 
	     android:toXDelta="0" 
	     android:duration="250"/>

	<rotate
	  android:fromDegrees="15"
	  android:toDegrees="0"
	  android:pivotX="0%"
	  android:pivotY="100%"
	  android:duration="300"
	  android:startOffset="0" />  

</set>  


 




 

Androidさんで、文字列を取得するときは、ローカライズされたstrings.xmlを使うわけですが、この中でHTMLのタグを使えるっぽいです。使えるHTMLのタグは、限定的で文字の装飾だけだと思われます。たぶん。

文字列のスタイルで使えるタグ
  • <b> : 強調文字
  • <i> : 斜体文字
  • <u> : 下線文字

AndroidでHTMLのタグを使う


使い方は、HTMLのタグを打ち込むときと一緒。strings.xmlでこんな感じに書きます
<string name="styledText"><i>斜体文字</i><b>強調文字</b><u>下線文字</u></string>

 

タグの使い方

layoutの中から、呼び出すこともできるし、
 
        <TextView
            android:id="@+id/test"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/styledText" />

プログラムのActivity上からも呼び出せます。
getText(  R.string.styledText );
getTextと似たメソッドにgetStringがあるんですけど、getStringで呼び出した場合は、タグは、無視される模様。



 

画像をAndroidの内部に保存する方法です。ひっかかったのがAndroidさんは、pngやjpgなんかは、Bitmapとして扱えるんですけど、gifは、bitmapとして扱えないみたい・・・。

pngやjpgを保存する

public String saveBitmap(Bitmap image, Context cx){
	String fileName = "filename"; 
	
	//保存先のファイル
	File file = new File(cx.getExternalCacheDir (), fileName);
	FileOutputStream outputStream;
	try {
		//change image scale
		// Bitmap resized =  Bitmap.createScaledBitmap(bmp, 100, 100, false);
	 
	  outputStream = new FileOutputStream(file);
	  image.compress(Bitmap.CompressFormat.PNG, 90, outputStream);
	  
	  outputStream.close();
	} catch (Exception e) {
	  e.printStackTrace();
	}	
	
	return fileName;
}
今書いてるコードから抜き出して、なんとなく書き換えただけなので、凄い適当なメソッドです。外部の一時フォルダーに保存するためにContextを渡してます。

肝となるのは、
image.compress(Bitmap.CompressFormat.PNG, 90, outputStream);
このcompressじゃないのかと。第一引数で画像の拡張子を指定して、第二引数で画質の指定、第三引数に出力するオブジェクトを渡します。また、PNGを指定した場合は、第二引数は意味がありません。





 

説明が難しいんですけど、作成中のAndroidアプリにアクティビティAがあったとして、そこからアクティビティBを呼び出した場合、通常であれば、ディバイスの「戻る」ボタンを押した時に、アクティビティAへと戻っていくんですけど、このAを呼び出させない方法です。

manifest.xmlの戻るボタンで表示させたくないアクティビティに、
<activity
    android:name="com.test.SampleActivityA"
    android:label="@string/app_name"
    android:noHistory="true" >      
</activity>  
見てお分かりの通り、 noHistory="true"の属性を加えるだけ!



参考:他にもいっぱいあるけど、いまいちよくわかりますん。
http://developer.android.com/guide/components/tasks-and-back-stack.html
http://developer.android.com/guide/topics/manifest/activity-element.html




 

このページのトップヘ