画像の回転処理

画像の回転処理

画像を回転させるには
ImageViewで
scaleType=”matrix”
として
回転用のMatrixを作成して
setImageMatrix()を呼び出して実現する

まずは、レイアウトファイルで定義

<ImageView
android:id="@+id/imageturn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:scaleType="matrix"
android:src="@drawable/ic_launcher"/>

そして、Javaで
Matrixの
postRotate()で回転情報をセットして
setImageMatrix()

ImageViewへ回転を適用する

まずは、タップするたびに90度回転する情報の設定

mRotate +=90F;
if(mRotate >= 360F){
  mRotate =0;
}

これは、角度が360度以上はないから

次に、画像回転処理

Matrix mtrx = new Matrix();

mtrx.postRotate(mRotate, ImageView.getDrawable().getBounds().width()/2,
mImageView().getDrawable().getBounds().height()/2);

mImageView.setImageMatrix(mtrx);

これで、タップするたび画像回転する

また、postRotate()の引数は、
前から順に
回転角度
回転の中心X座標
回転の中心Y座標
となる

今回なら
回転角度 mRotate

回転の中心x座標は
ImageViewに対して
getDrawable().getBounds().width()
でセットされている画像の幅を取得し
その数値を1/2にすることで割り出している

回転のY座標も同様に
ImageViewに対して
getDrawable.().getBounds().height()
でセットされている画像の高さを取得
その数値を1/2にすることで割り出している

画面より大きい画像の場合、スクロールで表示

画面より大きい画像の場合、スクロールで表示

端末の画面に入りきらない画像をレイアウトに表示した場合
通常では画面に入りきらない

この対策は、
ScrollView

HorizontalScrollView
を組み合わせることで画像を上下左右に
スクロールして表示できるようになる

まずは、レイアウトファイルで
ScrollView
HorizontalScrollView
LinearLayout
ImageView
というような構造で作成する

ソースにすると

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content">

<HorizontalScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<ImageView
android:layout_width="@dimen/image_size"
android:layout_height="@dimen/image_size"
android:background="@drawable/background"/>

</LinearLayout>

</HorizontalScrollView>

</ScrollView>

@dimenに関しては
http://www.techdoctranslator.com/android/guide/resources/available-resources/more-resources
を参考に

このように
ScrollView
HorizontalScrollViewを使うことで
少ないコードでも上下左右のスクロールが可能になる

ただし、斜めスクロールはできない
斜めスクロールも可能にしたいのなら
Viewのカスタマイズが必要になる

引越し関連メモ

最近、仕事の都合により東京に引越しました

これに伴いいくつか必要なものを購入したり
調べることがあったので、それに燗するメモです

まず、始めてダイヤル式メールボックスを使うことになったのですが
意味がわからなかったので検索し
ダイヤル式のメールボックスの開け方がわかりません。開け方を教えてくれませんか?
を参考に開けることができました

右へ2回→6」「左へ1回」なら
右回転で6に2回あわせて
左回転で1に合わせるとあく
というものです

つぎに、郵便番号の調べ方
いざ郵便番号を出そうとしても、新しい住所だとわからなくなりますので
郵便番号検索
から夕瓶番号を調べることができます

これはAmazon で買い物をするのに使えます

また Amazon ですが、仕事が忙しく、自宅にくるのを待っていられない
という場合、コンビに受け取りが可能で
ローソン、もしくはファミリーマートでの受け取りができます

これなら都合のよいときにとりにいけます

引越しに関して意外だったのがニトリで
ネットで購入しようとすると、1ヶ月以上かかるものが
店舗にいくと普通に売っています

どうやらニトリに関しては店舗にいったほうが早そうです
店舗検索については
ニトリの店舗検索
から行うことができます

食材などに関してはまだ検索中ですが調味料などは
地殻のスーパーでないものに関しては
KALDI COFFEE で聞いて買いしました
店舗に関しては
KALDI COFFEENO店舗検索
で調べました

調味料関連の知識があるのなら、ネットショップやAmazon という方法も使えます

なお、食材の購入に関しては
クックパッドにユーザ登録することで
近くの特売情報とそれをつかったレシピをみることができるので
これを参考に食材購入や料理をしています

プログラミングとかシステム構築関連の知識はあっても
生活に燗する知識が足りていないので
これを補ういい機会なのかもしれません

当面は新生活に関してのメモと
Android 関連のメモになりそうです

ImageViewで画像を縮小して表示

ImageViewで画像を縮小して表示

画像を縮小表示するには
setImageMatrix()を使う以外に
画像を事前にBitmapとして読み込み
リサイズすることで縮小表示ができる

使い道としては、サムネイル画像表示など

Bitmapからのサイズを指定するには

ImageView img = (ImageView)findViewById(R.id.imageview);
Resources res = getResources();

Bitmap bitmap = BitmapFactory.decodeResource(res, android.R.drawable.btn_star_big_on);

//Bitmap画像を200x90で作成
Bitmap bitmap2 = Bitmap.createScaleBitmap(bitmap, 200, 90, false);

img.setImageBitmap(bitmap2);

Bitmapの読み込みsizeはデバイスのメモリサイズに依存する
このため、大きいサイズのBitmapは読み込めないことがあるので注意

ImageViewで画像表示

ImageViewで画像表示

使い道は、画像表示

ImageViewで画像表示するには
まず、レイアウトファイルでImageViewを定義する

次に、Javaで処理

mImageView = (ImageView)findViewById(R.id.imageview);
findViewById(R.id.scaleCenter).setOnClickListener(this);
findViewById(R.id.scaleFitCenter).setOnClickListener(this);
findViewById(R.id.scaleFitEnd).setOnClickListener(this);
findViewById(R.id.scaleFitStart).setOnClickListener(this);
findViewById(R.id.scaleFitXY).setOnClickListener(this);
findViewById(R.id.scaleFitMatrix).setOnClickListener(this);

次に、クリックイベントの設定

public void onClick(View v){

switch(v.getId()){

case R.id.scaleCenter:
mImageView.setScaleType(ImageView.ScaleType.CENTER);
break;

case R.id.scaleFitCenter:
mImageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
break;

case R.id.scaleFitEnd:
mImageView.setScaleType(ImageView.ScaleType.FIT_END);
break;

case R.id.scaleStart:
mImageView.setScaleType(ImageView.ScaleType.FIT_START);
break;

case R.id.scaleFitXY:
mImageView.setScaleType(ImageView.ScaleType.FIT_XY);
break;

case R.id.scaleMatrix:
Matrix mtrx = new Matrix();
mImageView.setScaleType(ScaleType.MATRIX);
matrix.postRotate(90.0f, mImageView.getWidth()/3, mImageView.getHeight()/2);
mImageView.setImageMatrix(mtrx);
break;
}
}

ScaleTypeをセットすることで
画像の表示方法を設定できる

今回はボタンにセットすることで
画像表示方法を変えている

定数とその意味は

CENTER
サイズを変更せずにエリアの中央へ表示

CENTER_CROP
エリアの横幅まで画像を拡大し
中央へ表示

FIT_CENTER
エリアの縦幅まで画像を拡大、
中央へ表示

FIT_END
エリアの縦幅まで画像を拡大し
右端に寄せて表示

FIT_START
エリアの縦幅まで画像を拡大、
左端に寄せて表示

FIT_XY
エリア全体に画像を拡大して表示

MATRIX
エリアよ大きくても小さくてもそのまま表示

DatePickerのダイアログ表示

DatePickerのダイアログ表示

DatePickerをダイアログ表示することで
より使いやすくなる

ダイアログ表示するには
DatePickerDialog
を使う

DatePickerDialogの作成、表示はJavaで行う
これは、カレンダーの予約とかスケジュール管理に使える

private void showDatePickerDialog(){

Calender calender = Calender.getInstance();
int year = calender.get(Calender.Year);
int month = calender.get(Calender.Month);
int day = calender.get(Calender.DAY_OF_MONTH);

DatePickerDialog digDatePicker = new DatePickerDialog(this, new OnDateSetListener(){

@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth){

//選択した日付を検出
String date = year+"/"+monthOfYear+"/"+dayOfMonth;
Toast.makeText(MainActivity.this, "選択した日付は、"+date, Toast.LENGTH_SHORT).show();
}
},year, month, day);

digDialogPicker.show();
}

これで、DatePickerDialogが表示される

次に、TimePickerDialogについて
こちらは、目覚ましとかアラーム、ストップウォッチなど、主にタイマー関連で使える

TimePickerDialogもJavaで生成と表示を行う

private void showTimePickerDialog(boolean isUse24hour){

//現在の時間を取得
Calender calender = Calender.getInstance();

int hour = calender.get(Calender.HOUR_OF_DAY);
int minute = calender.get(Calender.MINUTE);


TimePickerDialog tDialog = new TimePickerDialog(this, new TimePickerDialog.OnTimeSetListener(){

@Override
public void OnTimeSet(TimePicker view, int hourOfDay, int minute){

//選択した時間を検出
String time = hourOfDay+":"+minute;
Toast.makeText(MainActivity.this,"選択した時間は、"+time+" です",Toast.LENGTH_SHORT).show();
}
},hour, minute, isUse24hour);
tDialog.show();
}

DatePickerやTimePickerでセットするリスナーとの違いは
DatePickerDialogで日付を取得するリスナーは
DatePickerで日付を取得するときに利用するものと違うものを使うけど
使い勝手は同じ

TimePickerDialogもTimePickerとは使うリスナーは違うけど
使い勝手は同じ

DatePickerへ初期値のセット

DatePickerへ初期値のセット

DatePickerの
updateDate()を使うと任意の年月日をセットできる

これは、登録画面とか
アンケートなどの入力画面で使われる

よく使われるデフォルトの値の設定にも使える

まずは、updateDate()で年月日の設定

//2014/06/21に設定
int year = 2014;
int month = 6-1;
int day = 21;

次に、日付のセット

DatePicker datepicker = (DatePicker)findViewById(R.id.datepicker);
datepicker.updateDate(year,month,day);

これで、デフォルトで
2014/06/21になる

次に、TimePickerに任意の値のセット
これは、乗り換え案内アプリとか
タイマー、目覚ましなどに使える

TimePickerは
setCurrentHour()で任意の時間をセット
setCurrentMinute()で任意の分をセット

もし、0:00に設定するなら

TimePicker timepicker = (TimePicker)findViewById(R.id.timepicker);
timepicker.setCurrentHour(0);
timepicker.setCurrentMinute(00);

となる

次に、任意の数値をセットするNumberPicker

これは、色々活用できて
デフォルトの値をセットするのに使える

セットするには
setValue()を使う
もし、50をセットするなら

NumberPicker numpicker = (NumberPicker)findViewById(R.id.numberpicker);
numpicker.setValue(50);

Picker関連の注意点として
DatePicker
TimePickerでは、現実に存在しない値をセットしても反映されない
例えば29時とかは無効になる

また、NumberPickerを使う場合
最大値を超えない処理を追記すること

Androidで、DatePicker

Androidで、DatePicker

DatePickerは、カレンダーとかのようなものを使うことで
日付などを入力しやすくするもの

DatePickerは、
onDateChangedListenerをセットすることで、
日付の取得を容易に行うことができる

まずは、レイアウトファイルで
DatePickerを設置する

<DatePicker
android:id="@+id/datepicker"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>

次に、Javaでインスタンスの取得

DatePicker datepicker = (DatePicker)findViewById(R.id.datepicker);

そして、DatePicker初期化とリスナー設定を行う

datepicker.init(yeah, month, day, new onDateChangedListener(){

@Override
public void onDateChanged(DatePicker view, int yeah, int monthOfYear, int dayOfMonth){

//選択した日付を検出
String date = year+"/"+monthOfYear+"/"+
dayOfMonth;
Toast.makeText(MainActivity.this,"今日は "+date+" です", Toast.LENGTH_SHORT).show();
}
});

Picker関連は大きく分けると3つになり
DatePicker
TimePicker
NumberPicker
となる

このうち、DatePickerだけは
リスナー設置方法が初期化と同時に行う

また、補助的なViewとして
カレンダー表示機能も使えるため
DatePickerを使うときにはレイアウト領域を多めに確保しておくこと

Androidで、ズームコントロール

Androidで、ズームコントロール

指2本でピンチイン、ピンチアウトするのではなく
+-ボタンを設置して拡大縮小するときに使う

これを使うメリットは、片手操作が可能になること

ズームコントロールを使うには、
ZoomControlsを使う

ズームイベントは
setOnZoomClickListener

ズームアウトイベントは
setOnZoomOutClickListener
で検出できる

まずは、レイアウトファイルで定義
とりあえず、今回はわかりやすさ重視のため
TextViewの文字のズーム
応用としては、写真とかカメラ画像など
色々使える

<TextView
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"/>

<ZoomControls
android:id="@+id/zoomcontrols"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"/>

android:layout_alignParentBottom=”true”
android:layout_alignParentRight=”true”
を設定することで、画面右下に
ズームボタンを設置

処理は、Javaで書くことになるので
まずは、Zoomcontrolsのインスタンス取得

final ZoomControls zc = (ZoomControls)findViewById(R.id.zoomcontrols);

TextView tvContents = (TextView)findViewById(R.id.text);

次に、ズームイン処理
setOnZoomClickListenerをセットして
+ボタンを押したときの動作を設定

zc.setOnZoomClickListener(new OnClickListener(){

@Override
public void onClick(View v){

scale +=0.1;
if(scale > 4) scale =4;

tvContents.setScaleX(scale);
tvContents.setScaleY(scale);
tvContents.setText(String.valueOf(scale));
}
});

次に、ズームアウト処理
これは、
setOnZoomOutClickListener
をセットすることで、
-ボタンを押したときの動作を設定

zc.setOnZoomOutClickListener(new OnClickListener(){

@Override
public void onClick(View v){

scale -=0.1;
if(scale <= 1) scale =1; tvContents.setScaleX(scale); tvContents.setScaleY(scale); tvContents.setText(String.valueOf(scalef)); } }); [/java] ZoomControlsは、ボタン設置はできるけど 拡大縮小機能は自分でズーム倍率を作成する必要があるので注意

Spinnerの利用

Spinnerの利用

Spinnerは、ArrayAdapterを使い
文字配列をセットすることで
ドロップダウンリストを表示できる

これは、Wikipediaのモバイル画面ででる
タップすると詳細がでるようなかんじ

まずは、レイアウトファイルで定義

<Spinner
android:id="@+id/spinner"
android:layout_width="wrap_content"
layout_height="wrap_content"/>

次に、Javaでdropdownリストに表示するアイテムを設定するため
Adapterを作成してSpinnerへセット

まずは、Adapterの作成

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item);

adapter.setDropdownViewResource(android.R.layout.simple_spinner_dropdown_item);

adapter.add("red");
adapter.add("blue");
adapter.add("green");

次に、SpinnerへAdapterをセット

Spinner spinner = (Spinner)findViewById(R.id.spinner);
spinner.setAdapter(adapter);

次に、Spinnerへ
setOnItemSelectedListener
をセットし、アイテムが選択されたときのイベント取得

spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener(){

@Override
public void OnItemSelected(AdapterView<?> parent, View view, int position, long id){

String item = (String)parent.selectedItem();
Toast.makeText(MainActivity.this, item + "を選択しました", Toast.LENGTH_SHORT).show();

}

@Override
public void onNothingSelected(AdapterView<?> arg0){
}
});

これで実装できる

setOnSelectedItemListener
を使うときの注意点は、
setOnSelectedItemListenerを使えばアイテムが
セットされたときのイベント取得ができるけど
画面回転などでonCreate()
が呼ばれるたびに実行されてしまうこと