GridView、グリッドビューに入れた画像が綺麗にならない、バラバラになる

みんな大好きグリッドビュー。

// 入れ込むべきレイアウト
GridView gridView = (GridView) v.findViewById(R.id.gridView);
gridView.setAdapter(new ImageAdapter(context, imageUrlList));

こうやって使いまっさ。ImageAdapterは独自のもの。そこに、context imageUrlListを渡します。

しかし、GridView、文字をいれるだけだと楽勝であるのだが、ネットから画像をよみこんでいれるとなるときっついのだ。それぞれの大きさがバラバラになったりして泣きそうになるのだ。他のサイトではすごく簡単にやり遂げているが。

import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.support.v4.util.LruCache;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;

import com.android.volley.RequestQueue;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.Volley;

import java.util.List;

/**
 * イメージローダー
 */
public class ImageAdapter extends ArrayAdapter<String> {

	public final String TAG = "ImageAdapter";

	private Context context;
	private RequestQueue mQueue;
	private ImageLoader mImageLoader;

	public ImageAdapter(Context context, List<String> objects) {
		super(context, 0, objects);
		this.context = context;
		mQueue = Volley.newRequestQueue(getContext());
		mImageLoader = new ImageLoader(mQueue, new BitmapCache());
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		String url = getItem(position);

		ImageView imageView;

		if (convertView == null) {
			imageView = new ImageView(getContext());

		} else {
			imageView = (ImageView) convertView;
		}
		// 画像取得処理
		ImageLoader.ImageListener listener = ImageLoader.getImageListener(imageView, android.R.drawable.ic_menu_rotate, android.R.drawable.ic_delete);

		// BASIC認証
		mImageLoader = new BasicAuthImageLoader(mQueue, new ImageLoader.ImageCache() {
			private final LruCache<String, Bitmap> mCache = new LruCache<String, Bitmap>(100);

			public void putBitmap(String url, Bitmap bitmap) {
				mCache.put(url, bitmap);
			}

			public Bitmap getBitmap(String url) {
				return mCache.get(url);
			}
		});

		mImageLoader.get(url, listener);

		// 画像のサイズをここで固定
		imageView.setMinimumWidth(300);
		imageView.setMinimumHeight(200);
		imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);

		// クリックイベント
		imageView.setOnClickListener(new View.OnClickListener() {

					public String url;

					public View.OnClickListener setUrl(String url) {
						this.url = url;
						return this;
					}

					public void onClick(View v) {
						// イメージ画像がクリックされたときに実行される処理
						Log.d(TAG, "url= " + url);

						// 画面遷移
						Intent intent = new Intent(context, TSUGINO_GAMEN.class);
						intent.putExtra("photoUrlAddress", url);
						context.startActivity(intent);

					}
				}.setUrl(url)
		);

		return imageView;
	}


}

ここで、

// 画像のサイズをここで固定
imageView.setMinimumWidth(300);
imageView.setMinimumHeight(200);
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);

これが必要だった。setScaleTypeはおこのみで。

クリックイベントにも注目。

// クリックイベント
imageView.setOnClickListener(new View.OnClickListener() {

			public String url;

			public View.OnClickListener setUrl(String url) {
				this.url = url;
				return this;
			}

			public void onClick(View v) {
				// イメージ画像がクリックされたときに実行される処理
				Log.d(TAG, "url= " + url);

				// 画面遷移
				Intent intent = new Intent(context, TSUGINO_GAMEN.class);
				intent.putExtra("photoUrlAddress", url);
				context.startActivity(intent);

			}
		}.setUrl(url)
);

setUrlを使ってurlをイベントリスナー内に入れ込んでいる。イベントに値を渡す方法。少し凝ったことをしたいなら必要になってくるだろう。

BASIC認証は使わないだろうからはずしてもいいじゃろう。

// BASIC認証
mImageLoader = new BasicAuthImageLoader(mQueue, new ImageLoader.ImageCache() {
	private final LruCache&lt;String, Bitmap&gt; mCache = new LruCache&lt;String, Bitmap&gt;(100);

	public void putBitmap(String url, Bitmap bitmap) {
		mCache.put(url, bitmap);
	}

	public Bitmap getBitmap(String url) {
		return mCache.get(url);
	}
});

Activity、Intentのことについて(いろんなオプション)

こちらを参考にして、
intent.setFlagsメソッドの引数について

画面を遷移するときなどにこれを渡せばいいらしい。使い方は以下のような、

// 引数1:自身のActivity、引数2:移動先のActivity名
Intent intent = new Intent(MainActivity.this, SubActivity.class);
			
// オプションを指定
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
			
// Activityの移動
startActivity(intent);

あとタスクに関係するのであればマニフェストの、

android:launchMode=”singleTask”

なども考慮するといいかもしれない。

また一つ賢くなったね!!

アラートダイアログの外側を押せないようにする

アラートダイアログの外側を押せないようにする、ダイアログは便利ですが外側を押しても反応しちゃう。

そこで

	// ダイアログ表示
	public AlertDialog.Builder builder;

こんな感じで、アラートダイアログを宣言して

builder = new AlertDialog.Builder(this);
builder.setTitle("登録しました");

// 外側を押せないようにする
builder.setCancelable(false);

builder.setNegativeButton("OK", new DialogInterface.OnClickListener() {
	public void onClick(DialogInterface dialog, int which) {

		// 遷移
		Intent intent = new Intent(getApplicationContext(), hogehoge.class);
		startActivity(intent);

	}
});

// 表示
builder.create().show();

こうすればいいですね。

builder.create().show(); の create() はわけわかめ。なんだろうか、こいつは。

自分的Volleyの定番コード

自分的Volleyの定番コード

CustomRequestクラスを作成して以下の文章でvolley使う。例文はPOSTを使用する場合です。

		HashMap<String, String> postMap = new HashMap<String, String>();

		postMap.put("uuid", uuId);

		RequestQueue requestQueue = Volley.newRequestQueue(this);
		CustomRequest jsObjRequest = new CustomRequest(Request.Method.POST, Constant.USER_ADD_URL, postMap,
				new Response.Listener<JSONObject>() {
					@Override
					public void onResponse(JSONObject response) {

						Log.v("初期ユーザー登録、JSON", response.toString());

						// ここでタイマー起動
						// 3秒カウント開始のスケジュール
						timer = new Timer();
						timer.schedule(new MyTimer(), Constant.TITLE_COUNT_SEC);

					}
				},
				new Response.ErrorListener() {
					@Override
					public void onErrorResponse(VolleyError error) {

						Log.v("初期ユーザー登録、VolleyErr", "" + error);

					}
				});
		requestQueue.add(jsObjRequest);
public class CustomRequest extends Request<JSONObject> {

	private Response.Listener<JSONObject> listener;
	private Map<String, String> params;

	public CustomRequest(String url, Map<String, String> params,
						 Response.Listener<JSONObject> reponseListener, Response.ErrorListener errorListener) {
		super(Request.Method.GET, url, errorListener);
		this.listener = reponseListener;
		this.params = params;
	}

	public CustomRequest(int method, String url, Map<String, String> params,
						 Response.Listener<JSONObject> reponseListener, Response.ErrorListener errorListener) {
		super(method, url, errorListener);
		this.listener = reponseListener;
		this.params = params;
	}

	protected Map<String, String> getParams()
			throws com.android.volley.AuthFailureError {
		return params;
	}

	;

	@Override
	protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
		try {
			String jsonString = new String(response.data,
					HttpHeaderParser.parseCharset(response.headers));
			return Response.success(new JSONObject(jsonString),
					HttpHeaderParser.parseCacheHeaders(response));
		} catch (UnsupportedEncodingException e) {
			return Response.error(new ParseError(e));
		} catch (JSONException je) {
			return Response.error(new ParseError(je));
		}
	}

	@Override
	protected void deliverResponse(JSONObject response) {
		// TODO Auto-generated method stub
		listener.onResponse(response);
	}
}

イテレーターを使わないとJSONが解析できないことに気がついた

JSONでキーがあらかじめわかっていれば、使うのは簡単だった。

でもキーがわからないときはどうすればいいのか?

以下のとおり。

            JSONObject menuJson = new JSONObject(MENU_JSON);
            Iterator<?> keys = menuJson.keys();

            Log.d(TAG, "keys= " + keys.hasNext());

            while (keys.hasNext()) {
                String key = (String) keys.next();
                Log.d(TAG, "" + key);

                JSONObject j = new JSONObject(menuJson.getString(key));
                Iterator<?> keyss = j.keys();

                while (keyss.hasNext()) {

                    String keyy = (String) keyss.next();
                    Log.d(TAG, "" + keyy);

                }

            }

下がミソじゃの

while (keys.hasNext()) {
                String key = (String) keys.next();
}

Googleスプレッドシートを利用したGASのAPIを誰でも使えるようにする

Googleスプレッドシートを利用したGASのAPIを誰でも使えるようにしたかったんだけど、なかなか難しい。

解決策として、スプレッドシート内で作成したものを公開するのではなく、

Googleドライブ上に

スクリーンショット 2016-03-09 18.11.37

みたいな感じでスクリプトファイル自体を作成できるようにして、そこで新たにスクリプトを書く。

そのスクリプトをウェブアプリケーションとして公開!とやると、簡単に行けた。

どこからでもアクセスできるAPIができました。

Googleスプレッドシートは、スマホからでも簡単に更新できるため、かなりの利用幅が効くようになると思います。

Javaでマッチング、正規表現のとき、$1 $2 とか使いたいじゃん

Pattern p = Pattern.compile("^(.*?)(.png)$");
Matcher m = p.matcher(photoUrl);
String result = m.replaceFirst("$1"); 

こうすると result に$1が入るよ。つまり、

^(.*?)(.png)$

の最初の括弧の

(.*?)

にマッチした部分がゲットできるってことね。

photoUrl = “hogehoge.png”;

だったら、

hogehoge

がとれるってことだよん。

google スプレッドシートを利用してJSONをAPIで発行

基本はJavascript。

doOutput(e)関数で吐き出すらしい。これをAPIにすると、超便利である。

まず、
var summaryData = sh.getDataRange().getValues();
がミソ。これで一度すべてのシート内容を読む。シートが巨大な時はこれをつかう。早いから。

リターンで返す時は、
return ContentService.createTextOutput(JSON.stringify(json)).setMimeType(ContentService.MimeType.JSON);
などなど。単純に文字列を返してもだめっすよ、怒られます。

function doGet(e){ 
  var json = myFunction();
  Logger.log(JSON.stringify(json));
  return ContentService.createTextOutput(JSON.stringify(json)).setMimeType(ContentService.MimeType.JSON);
}

function doPost(e) {
  var json = myFunction();
  Logger.log(JSON.stringify(json));  
  return ContentService.createTextOutput(JSON.stringify(json)).setMimeType(ContentService.MimeType.JSON);
}

function myFunction() {
  
  var url = 'https://docs.google.com/spreadsheets/xxxxxxxxxxxxxxxxxxxxxxxxxx';
  var bk = SpreadsheetApp.openByUrl(url);
 var sh = bk.getSheetByName("food_drink");
  
  // 最後行を取得
  var lastRow = sh.getLastRow() - 1;
  // 最後列を取得
  var lastColumn = sh.getLastColumn();
  
  var list = [];
  var obj = {};
  var objShou = {};
  var objChuu = {};
  
 var summaryData = sh.getDataRange().getValues();
 
 Logger.log(lastRow);
  
  for (var y = 1; y <= lastRow; y++) {
  
    // 名前取得
  var obj1 = {};
  obj1.name = summaryData[y][4];
  obj1.money = summaryData[y][5];
  obj1.iconImageUrl = summaryData[y][6];
  obj1.photoImageUrl = summaryData[y][7];
  obj1.id = summaryData[y][0];
 
   list.push(obj1);
   
   // 小カテゴリー、次に変化があればオブジェクトへいれる
    if (y < lastRow) {
   
     var dy1 = summaryData[y][3];
     var dy2 = summaryData[y+1][3];
     if (dy1 != dy2) {
       objShou[dy1] = list;
       list = [];
     }
   
   } else {
   
     var dy1 = summaryData[y][3];
     objShou[dy1] = list;
     list = [];
   
   }
   
   // 中カテゴリー、次に変化があればオブジェクトへいれる
   if (y < lastRow) {
   
     var cy1 = summaryData[y][2];
     var cy2 = summaryData[y+1][2];
     if (cy1 != cy2) {
       objChuu[cy1] = objShou;
       objShou = {};
     }
   
   } else {
   
     var cy1 = summaryData[y][2];
       objChuu[cy1] = objShou;
       objShou = {};
   
   }
  
  }
  
  return objChuu;
  
}

よく使うタイマーの流れ

タイマーをよく使うのですが、備忘録として。

		// タイマー作動
		Timer timer1 = new Timer();
		Handler handler1 = new Handler();
		timer1.schedule(new DownloadTimer(), 0, 2000);

タイマー、ハンドラーを宣言。その後のスケジュールで0秒から開始、その後2000ミリ秒ごと(2秒)にタイマー作動。となっています。 new DownloadTimer() を宣言してそれを実行することになっています。

実際の処理内は、

	class DownloadTimer extends TimerTask {

		@Override
		public void run() {
			handler1.post(new Runnable(){
				@Override
				public void run() {


				}

			});

		}

	}

こんな感じでクラスをつくり public void run() { } に処理をかきます。それが実行されます。

ストレージに画像保存するためのクラス

public class ImageManager {

	private Context mContext;
	private String fileFullPath;

	public ImageManager(Context context) {
		mContext = context;
	}

	/**
	 * 画像の保存
	 *
	 * @param bitmap
	 * @param albumName
	 */
	public void save(Bitmap bitmap, String albumName) {
		if (!canUseSd()) {
			Log.e("Error", "Can't use SD Card");

			return;
		}

		saveToSd(getSdStorageDir(albumName), bitmap);
	}

	/**
	 * ストレージに画像保存
	 *
	 * @param dir
	 * @param bitmap
	 */
	private void saveToSd(File dir, Bitmap bitmap) {
		String fileName = getFileName();
		fileFullPath = dir.getAbsolutePath() + "/" + fileName;

		Log.d("保存パス","fileFullPath= " + fileFullPath);

		try {
			// 保存処理
			FileOutputStream fos = new FileOutputStream(fileFullPath);
			bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
			fos.flush();
			fos.close();
		} catch (Exception e) {
			Log.e("Error", "" + e.toString());
		} finally {
			// アルバムに反映
			addGallery(fileName);
		}
	}

	/**
	 * 保存した画像をギャラリーに追加
	 *
	 * @param fileName
	 */
	private void addGallery(String fileName) {
		try {
			ContentValues values = new ContentValues();
			ContentResolver contentResolver = mContext.getContentResolver();
			values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
			values.put(MediaStore.Images.Media.TITLE, fileName);
			values.put("_data", fileFullPath);
			contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
		} catch (Exception e) {
			Log.e("Error", "" + e);
		}
	}

	/**
	 * 画像のファイル名を日付から生成し取得
	 *
	 * @return
	 */
	private String getFileName() {
		Date mDate = new Date();
		SimpleDateFormat fileNameFormat = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.ENGLISH);
		String fileName = fileNameFormat.format(mDate) + ".jpg";

		return fileName;
	}

	/**
	 * ストレージのストレージパス取得
	 *
	 * @param albumName
	 * @return
	 */
	private File getSdStorageDir(String albumName) {
		File dir = new File(Environment.getExternalStoragePublicDirectory(
				Environment.DIRECTORY_PICTURES), albumName);

		if (!dir.exists()) {
			if (!dir.mkdirs()) {
				Log.e("Error", "Directory not created");
			}
		}

		return dir;
	}

	/**
	 * ストレージが読み込み可能か
	 *
	 * @return
	 */
	public boolean canReadSd() {
		String status = Environment.getExternalStorageState();
		if (!status.equals(Environment.MEDIA_MOUNTED)) {
			return false;
		}

		File file = Environment.getExternalStorageDirectory();
		if (file.canRead()) {
			return true;
		}

		return false;
	}

	/**
	 * ストレージに書き込み可能か
	 *
	 * @return
	 */
	public boolean canWriteSd() {
		String status = Environment.getExternalStorageState();
		if (!status.equals(Environment.MEDIA_MOUNTED)) {
			return false;
		}

		File file = Environment.getExternalStorageDirectory();
		if (file.canWrite()) {
			return true;
		}

		return false;
	}

	/**
	 * ストレージが使用可能か
	 *
	 * @return
	 */
	public boolean canUseSd() {
		return canReadSd() && canWriteSd();
	}
}

使い方は、

			ImageView imageView = (ImageView) findViewById(R.id.photo_image);
			Bitmap imageForScale = ((BitmapDrawable) imageView.getDrawable()).getBitmap();

			ImageManager imageManager = new ImageManager(this);
			try {
				String albumName = "Save image sample";
				imageManager.save(imageForScale, albumName);
			} catch (Error e) {
				Log.e("MainActivity", "onCreate: " + e);
			}

レイアウトというかsetContentViewで設置したレイアウトを丸ごと渡したい

例えば、入力チェックなどのバリデータチェックとかのクラスを使いまわしたいときとか、レイアウトまるごと渡したいよね。

			View contentView = ((ViewGroup)findViewById(android.R.id.content));
			String errMsg = new ValidatorCheck().getValidatorCheck(contentView);

こうしたら渡せるね

あ、ValidatorCheck ではチェックしたりしてエラーメッセージが累積して返って来る仕組み。

ボタンを半透明化ぁああああ

		Button buttonKakunin = (Button) findViewById(R.id.buttonKakunin);
		buttonKakunin.setEnabled(false);
		float alpha = 0.45f;
		AlphaAnimation alphaUp = new AlphaAnimation(alpha, alpha);
		alphaUp.setFillAfter(true);
		buttonKakunin.startAnimation(alphaUp);

半透明化なんだけどさ、ここまでやんないとだめみたい。

レイアウトとか、ボタンとか、あちこちアニメーションしたいよね!

 

		FrameLayout main = (FrameLayout) findViewById(R.id.main);

		// 移動アニメーション
		TranslateAnimation2 translateAnimation = new TranslateAnimation2(1400.0f, 0.0f, 0.0f, 0.0f, Easing.easeInOutQuart);
		translateAnimation.setDuration(1200);
		translateAnimation.setFillAfter(true);
		main.startAnimation(translateAnimation);

TranslateAnimation2クラスとか
Easingクラスとかいるからね

public class Easing {

   public static String easeInQuad = "easeInQuad";
   public static String easeOutQuad = "easeOutQuad";
   public static String easeInOutQuad = "easeInOutQuad";
   public static String easeInCubic = "easeInCubic";
   public static String easeOutCubic = "easeOutCubic";
   public static String easeInOutCubic = "easeInOutCubic";
   public static String easeInQuart = "easeInQuart";
   public static String easeOutQuart = "easeOutQuart";
   public static String easeInOutQuart = "easeInOutQuart";
   public static String easeInQuint = "easeInQuint";
   public static String easeOutQuint = "easeOutQuint";
   public static String easeInOutQuint = "easeInOutQuint";
   public static String easeInSine = "easeInSine";
   public static String easeOutSine = "easeOutSine";
   public static String easeInOutSine = "easeInOutSine";
   public static String easeInExpo = "easeInExpo";
   public static String easeOutExpo = "easeOutExpo";
   public static String easeInOutExpo = "easeInOutExpo";
   public static String easeInCirc = "easeInCirc";
   public static String easeOutCirc = "easeOutCirc";
   public static String easeInOutCirc = "easeInOutCirc";
   public static String easeInElastic = "easeInElastic";
   public static String easeOutElastic = "easeOutElastic";
   public static String easeInOutElastic = "easeInOutElastic";
   public static String easeInBack = "easeInBack";
   public static String easeOutBack = "easeOutBack";
   public static String easeInOutBack = "easeInOutBack";
   public static String easeInBounce = "easeInBounce";
   public static String easeOutBounce = "easeOutBounce";
   public static String easeInOutBounce = "easeInOutBounce";

   public static float move(float t, String easing) {
      if (easing.equals(easeInQuad)) {
         return easeInQuad(t);
      } else if (easing.equals(easeOutQuad)) {
         return easeOutQuad(t);
      } else if (easing.equals(easeInOutQuad)) {
         return easeInOutQuad(t);
      } else if (easing.equals(easeInCubic)) {
         return easeInCubic(t);
      } else if (easing.equals(easeOutCubic)) {
         return easeOutCubic(t);
      } else if (easing.equals(easeInOutCubic)) {
         return easeInOutCubic(t);
      } else if (easing.equals(easeInQuart)) {
         return easeInQuart(t);
      } else if (easing.equals(easeOutQuart)) {
         return easeOutQuart(t);
      } else if (easing.equals(easeInOutQuart)) {
         return easeInOutQuart(t);
      } else if (easing.equals(easeInQuint)) {
         return easeInQuint(t);
      } else if (easing.equals(easeOutQuint)) {
         return easeOutQuint(t);
      } else if (easing.equals(easeInOutQuint)) {
         return easeInOutQuint(t);
      } else if (easing.equals(easeInSine)) {
         return easeInSine(t);
      } else if (easing.equals(easeOutSine)) {
         return easeOutSine(t);
      } else if (easing.equals(easeInOutSine)) {
         return easeInOutSine(t);
      } else if (easing.equals(easeInExpo)) {
         return easeInExpo(t);
      } else if (easing.equals(easeOutExpo)) {
         return easeOutExpo(t);
      } else if (easing.equals(easeInOutExpo)) {
         return easeInOutExpo(t);
      } else if (easing.equals(easeInCirc)) {
         return easeInCirc(t);
      } else if (easing.equals(easeOutCirc)) {
         return easeOutCirc(t);
      } else if (easing.equals(easeInOutCirc)) {
         return easeInOutCirc(t);
      } else if (easing.equals(easeInElastic)) {
         return easeInElastic(t);
      } else if (easing.equals(easeOutElastic)) {
         return easeOutElastic(t);
      } else if (easing.equals(easeInOutElastic)) {
         return easeInOutElastic(t);
      } else if (easing.equals(easeInBack)) {
         return easeInBack(t);
      } else if (easing.equals(easeOutBack)) {
         return easeOutBack(t);
      } else if (easing.equals(easeInOutBack)) {
         return easeInOutBack(t);
      } else if (easing.equals(easeInBounce)) {
         return easeInBounce(t);
      } else if (easing.equals(easeOutBounce)) {
         return easeOutBounce(t);
      } else if (easing.equals(easeInOutBounce)) {
         return easeInOutBounce(t);
      }
      return t;
   }

   public static float easeInQuad(float t) {
      return easeInQuad(t, 0f, 1f, 1f);
   }

   public static float easeOutQuad(float t) {
      return easeInQuad(t, 0f, 1f, 1f);
   }

   public static float easeInOutQuad(float t) {
      return easeInOutQuad(t, 0f, 1f, 1f);
   }

   public static float easeInCubic(float t) {
      return easeInCubic(t, 0f, 1f, 1f);
   }

   public static float easeOutCubic(float t) {
      return easeOutCubic(t, 0f, 1f, 1f);
   }

   public static float easeInOutCubic(float t) {
      return easeInOutCubic(t, 0f, 1f, 1f);
   }

   public static float easeInQuart(float t) {
      return easeInQuart(t, 0f, 1f, 1f);
   }

   public static float easeOutQuart(float t) {
      return easeOutQuart(t, 0f, 1f, 1f);
   }

   public static float easeInOutQuart(float t) {
      return easeInOutQuart(t, 0f, 1f, 1f);
   }

   public static float easeInQuint(float t) {
      return easeInQuint(t, 0f, 1f, 1f);
   }

   public static float easeOutQuint(float t) {
      return easeOutQuint(t, 0f, 1f, 1f);
   }

   public static float easeInOutQuint(float t) {
      return easeInOutQuint(t, 0f, 1f, 1f);
   }

   public static float easeInSine(float t) {
      return easeInSine(t, 0f, 1f, 1f);
   }

   public static float easeOutSine(float t) {
      return easeOutSine(t, 0f, 1f, 1f);
   }

   public static float easeInOutSine(float t) {
      return easeInOutSine(t, 0f, 1f, 1f);
   }

   public static float easeInExpo(float t) {
      return easeInExpo(t, 0f, 1f, 1f);
   }

   public static float easeOutExpo(float t) {
      return easeOutExpo(t, 0f, 1f, 1f);
   }

   public static float easeInOutExpo(float t) {
      return easeInOutExpo(t, 0f, 1f, 1f);
   }

   public static float easeInCirc(float t) {
      return easeInCirc(t, 0f, 1f, 1f);
   }

   public static float easeOutCirc(float t) {
      return easeOutCirc(t, 0f, 1f, 1f);
   }

   public static float easeInOutCirc(float t) {
      return easeInOutCirc(t, 0f, 1f, 1f);
   }

   public static float easeInElastic(float t) {
      return easeInElastic(t, 0f, 1f, 1f);
   }

   public static float easeOutElastic(float t) {
      return easeOutElastic(t, 0f, 1f, 1f);
   }

   public static float easeInOutElastic(float t) {
      return easeInOutElastic(t, 0f, 1f, 1f);
   }

   public static float easeInBack(float t) {
      return easeInBack(t, 0f, 1f, 1f, 1.70158f);
   }

   public static float easeOutBack(float t) {
      return easeOutBack(t, 0f, 1f, 1f, 1.70158f);
   }

   public static float easeInOutBack(float t) {
      return easeInOutBack(t, 0f, 1f, 1f, 1.70158f);
   }

   public static float easeInBounce(float t) {
      return easeInBounce(t, 0f, 1f, 1f);
   }

   public static float easeOutBounce(float t) {
      return easeOutBounce(t, 0f, 1f, 1f);
   }

   public static float easeInOutBounce(float t) {
      return easeInOutBounce(t, 0f, 1f, 1f);
   }

   /**/

   public static float easeInQuad(float t, float b, float c, float d) {
      return c * (t /= d) * t + b;
   }

   public static float easeOutQuad(float t, float b, float c, float d) {
      return -c * (t /= d) * (t - 2f) + b;
   }

   public static float easeInOutQuad(float t, float b, float c, float d) {
      if ((t /= d / 2f) < 1)
         return c / 2f * t * t + b;
      return -c / 2f * ((--t) * (t - 2f) - 1) + b;
   }

   public static float easeInCubic(float t, float b, float c, float d) {
      return c * (t /= d) * t * t + b;
   }

   public static float easeOutCubic(float t, float b, float c, float d) {
      return c * ((t = t / d - 1f) * t * t + 1f) + b;
   }

   public static float easeInOutCubic(float t, float b, float c, float d) {
      if ((t /= d / 2f) < 1)
         return c / 2f * t * t * t + b;
      return c / 2f * ((t -= 2f) * t * t + 2f) + b;
   }

   public static float easeInQuart(float t, float b, float c, float d) {
      return c * (t /= d) * t * t * t + b;
   }

   public static float easeOutQuart(float t, float b, float c, float d) {
      return -c * ((t = t / d - 1f) * t * t * t - 1f) + b;
   }

   public static float easeInOutQuart(float t, float b, float c, float d) {
      if ((t /= d / 2f) < 1f)
         return c / 2f * t * t * t * t + b;
      return -c / 2f * ((t -= 2f) * t * t * t - 2f) + b;
   }

   public static float easeInQuint(float t, float b, float c, float d) {
      return c * (t /= d) * t * t * t * t + b;
   }

   public static float easeOutQuint(float t, float b, float c, float d) {
      return c * ((t = t / d - 1f) * t * t * t * t + 1f) + b;
   }

   public static float easeInOutQuint(float t, float b, float c, float d) {
      if ((t /= d / 2f) < 1f)
         return c / 2f * t * t * t * t * t + b;
      return c / 2f * ((t -= 2f) * t * t * t * t + 2f) + b;
   }

   public static float easeInSine(float t, float b, float c, float d) {
      return (float) (-c * Math.cos(t / d * (Math.PI / 2f)) + c + b);
   }

   public static float easeOutSine(float t, float b, float c, float d) {
      return (float) (c * Math.sin(t / d * (Math.PI / 2f)) + b);
   }

   public static float easeInOutSine(float t, float b, float c, float d) {
      return (float) (-c / 2f * (Math.cos(Math.PI * t / d) - 1) + b);
   }

   public static float easeInExpo(float t, float b, float c, float d) {
      return (float) ((t == 0) ? b : c * Math.pow(2, 10f * (t / d - 1f)) + b);
   }

   public static float easeOutExpo(float t, float b, float c, float d) {
      return (float) ((t == d) ? b + c : c * (-Math.pow(2, -10f * t / d) + 1f) + b);
   }

   public static float easeInOutExpo(float t, float b, float c, float d) {
      if (t == 0)
         return b;
      if (t == d)
         return b + c;
      if ((t /= d / 2f) < 1f)
         return (float) (c / 2f * Math.pow(2, 10f * (t - 1f)) + b);
      return (float) (c / 2f * (-Math.pow(2, -10f * --t) + 2f) + b);
   }

   public static float easeInCirc(float t, float b, float c, float d) {
      return (float) (-c * (Math.sqrt(1f - (t /= d) * t) - 1f) + b);
   }

   public static float easeOutCirc(float t, float b, float c, float d) {
      return (float) (c * Math.sqrt(1 - (t = t / d - 1) * t) + b);
   }

   public static float easeInOutCirc(float t, float b, float c, float d) {
      if ((t /= d / 2) < 1)
         return (float) (-c / 2 * (Math.sqrt(1 - t * t) - 1) + b);
      return (float) (c / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1) + b);
   }

   public static float easeInElastic(float t, float b, float c, float d) {
      float s = 1.70158f;
      float p = 0;
      float a = c;
      if (t == 0)
         return b;
      if ((t /= d) == 1)
         return b + c;
      p = d * 0.3f;
      if (a < Math.abs(c)) {
         a = c;
         s = p / 4f;
      } else
         s = (float) (p / (2f * Math.PI) * Math.asin(c / a));
      return (float) (-(a * Math.pow(2, 10f * (t -= 1f)) * Math.sin((t * d - s) * (2f * Math.PI) / p)) + b);
   }

   public static float easeOutElastic(float t, float b, float c, float d) {
      float s = 1.70158f;
      float p = 0;
      float a = c;
      if (t == 0)
         return b;
      if ((t /= d) == 1)
         return b + c;
      p = d * 0.3f;
      if (a < Math.abs(c)) {
         a = c;
         s = p / 4f;
      } else
         s = (float) (p / (2f * Math.PI) * Math.asin(c / a));
      return (float) (a * Math.pow(2, -10f * t) * Math.sin((t * d - s) * (2f * Math.PI) / p) + c + b);
   }

   public static float easeInOutElastic(float t, float b, float c, float d) {
      float s = 1.70158f;
      float p = 0;
      float a = c;
      if (t == 0)
         return b;
      if ((t /= d / 2) == 2)
         return b + c;
      p = d * (0.3f * 1.5f);
      if (a < Math.abs(c)) {
         a = c;
         s = p / 4f;
      } else
         s = (float) (p / (2f * Math.PI) * Math.asin(c / a));
      if (t < 1)
         return (float) (-0.5f * (a * Math.pow(2, 10f * (t -= 1f)) * Math.sin((t * d - s) * (2f * Math.PI) / p)) + b);
      return (float) (a * Math.pow(2, -10f * (t -= 1f)) * Math.sin((t * d - s) * (2f * Math.PI) / p) * 0.5f + c + b);
   }

   public static float easeInBack(float t, float b, float c, float d, float s) {
      return c * (t /= d) * t * ((s + 1f) * t - s) + b;
   }

   public static float easeOutBack(float t, float b, float c, float d, float s) {
      return c * ((t = t / d - 1f) * t * ((s + 1f) * t + s) + 1f) + b;
   }

   public static float easeInOutBack(float t, float b, float c, float d, float s) {
      if ((t /= d / 2f) < 1)
         return c / 2f * (t * t * (((s *= (1.525f)) + 1f) * t - s)) + b;
      return c / 2f * ((t -= 2f) * t * (((s *= (1.525f)) + 1f) * t + s) + 2f) + b;
   }

   public static float easeInBounce(float t, float b, float c, float d) {
      return c - easeOutBounce(d - t, 0, c, d) + b;
   }

   public static float easeOutBounce(float t, float b, float c, float d) {
      if ((t /= d) < (1f / 2.75f)) {
         return c * (7.5625f * t * t) + b;
      } else if (t < (2f / 2.75f)) {
         return c * (7.5625f * (t -= (1.5f / 2.75f)) * t + 0.75f) + b;
      } else if (t < (2.5f / 2.75f)) {
         return c * (7.5625f * (t -= (2.25f / 2.75f)) * t + 0.9375f) + b;
      } else {
         return c * (7.5625f * (t -= (2.625f / 2.75f)) * t + 0.984375f) + b;
      }
   }

   public static float easeInOutBounce(float t, float b, float c, float d) {
      if (t < d / 2f)
         return easeInBounce(t * 2f, 0, c, d) * 0.5f + b;
      return easeOutBounce(t * 2f - d, 0, c, d) * 0.5f + c * 0.5f + b;
   }
}

そんでもって

import android.view.animation.Animation;
import android.view.animation.LinearInterpolator;
import android.view.animation.Transformation;

public class TranslateAnimation2 extends Animation {

   private int mFromXType = ABSOLUTE;
   private int mToXType = ABSOLUTE;

   private int mFromYType = ABSOLUTE;
   private int mToYType = ABSOLUTE;

   private float mFromXValue = 0.0f;
   private float mToXValue = 0.0f;

   private float mFromYValue = 0.0f;
   private float mToYValue = 0.0f;

   private float mFromXDelta;
   private float mToXDelta;
   private float mFromYDelta;
   private float mToYDelta;

   private String easing;
   /**
    * Constructor to use when building a TranslateAnimation from code
    *
    * @param fromXDelta
    *            Change in X coordinate to apply at the start of the animation
    * @param toXDelta
    *            Change in X coordinate to apply at the end of the animation
    * @param fromYDelta
    *            Change in Y coordinate to apply at the start of the animation
    * @param toYDelta
    *            Change in Y coordinate to apply at the end of the animation
    */
   public TranslateAnimation2(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta,String _easing) {
      mFromXValue = fromXDelta;
      mToXValue = toXDelta;
      mFromYValue = fromYDelta;
      mToYValue = toYDelta;

      mFromXType = ABSOLUTE;
      mToXType = ABSOLUTE;
      mFromYType = ABSOLUTE;
      mToYType = ABSOLUTE;
      easing = _easing;
      setInterpolator(new LinearInterpolator());
   }

   /**
    * Constructor to use when building a TranslateAnimation from code
    *
    * @param fromXType
    *            Specifies how fromXValue should be interpreted. One of
    *            Animation.ABSOLUTE, Animation.RELATIVE_TO_SELF, or
    *            Animation.RELATIVE_TO_PARENT.
    * @param fromXValue
    *            Change in X coordinate to apply at the start of the animation.
    *            This value can either be an absolute number if fromXType is
    *            ABSOLUTE, or a percentage (where 1.0 is 100%) otherwise.
    * @param toXType
    *            Specifies how toXValue should be interpreted. One of
    *            Animation.ABSOLUTE, Animation.RELATIVE_TO_SELF, or
    *            Animation.RELATIVE_TO_PARENT.
    * @param toXValue
    *            Change in X coordinate to apply at the end of the animation.
    *            This value can either be an absolute number if toXType is
    *            ABSOLUTE, or a percentage (where 1.0 is 100%) otherwise.
    * @param fromYType
    *            Specifies how fromYValue should be interpreted. One of
    *            Animation.ABSOLUTE, Animation.RELATIVE_TO_SELF, or
    *            Animation.RELATIVE_TO_PARENT.
    * @param fromYValue
    *            Change in Y coordinate to apply at the start of the animation.
    *            This value can either be an absolute number if fromYType is
    *            ABSOLUTE, or a percentage (where 1.0 is 100%) otherwise.
    * @param toYType
    *            Specifies how toYValue should be interpreted. One of
    *            Animation.ABSOLUTE, Animation.RELATIVE_TO_SELF, or
    *            Animation.RELATIVE_TO_PARENT.
    * @param toYValue
    *            Change in Y coordinate to apply at the end of the animation.
    *            This value can either be an absolute number if toYType is
    *            ABSOLUTE, or a percentage (where 1.0 is 100%) otherwise.
    */
   public TranslateAnimation2(int fromXType, float fromXValue, int toXType, float toXValue, int fromYType, float fromYValue, int toYType, float toYValue,String _easing) {
      mFromXValue = fromXValue;
      mToXValue = toXValue;
      mFromYValue = fromYValue;
      mToYValue = toYValue;
      mFromXType = fromXType;
      mToXType = toXType;
      mFromYType = fromYType;
      mToYType = toYType;
      setInterpolator(new LinearInterpolator());
      easing = _easing;
   }

   @Override
   protected void applyTransformation(float interpolatedTime, Transformation t) {
      float dx = mFromXDelta;
      float dy = mFromYDelta;
      if (mFromXDelta != mToXDelta) {
         dx = mFromXDelta + ((mToXDelta - mFromXDelta) * Easing.move(interpolatedTime,easing));
      }
      if (mFromYDelta != mToYDelta) {
         dy = mFromYDelta + ((mToYDelta - mFromYDelta) * Easing.move(interpolatedTime,easing));
      }
      t.getMatrix().setTranslate(dx, dy);
   }

   @Override
   public void initialize(int width, int height, int parentWidth, int parentHeight) {
      super.initialize(width, height, parentWidth, parentHeight);
      mFromXDelta = resolveSize(mFromXType, mFromXValue, width, parentWidth);
      mToXDelta = resolveSize(mToXType, mToXValue, width, parentWidth);
      mFromYDelta = resolveSize(mFromYType, mFromYValue, height, parentHeight);
      mToYDelta = resolveSize(mToYType, mToYValue, height, parentHeight);
   }
}

つかうときはこげな感じ

FrameLayout main = (FrameLayout) findViewById(R.id.main);

//てけとーなレイアウトとかを

TranslateAnimation2 translateAnimation = new TranslateAnimation2(-1400.0f, 0.0f, 0.0f, 0.0f, Easing.easeOutBounce);
translateAnimation.setDuration(1000);
translateAnimation.setFillAfter(true);
main.startAnimation(translateAnimation);

こんな風にすると、びっくりただのアニメーションにバウンスついたりする。これはJavaScriptでもよくある手法だよぬ!

TranslateAnimation2(-1400.0f, 0.0f, 0.0f, 0.0f, Easing.easeOutBounce);

ポイントは上の一行ですね。

クラスファイルを2つ使用するだけでいけるので、ちょびっとアニメーションしたいときなんか簡単でいいですよね。

 

参考サイトhttp://andante.in/i/java/%E5%89%8D%E5%9B%9E%E4%BD%9C%E3%81%A3%E3%81%9Feasing%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%80%81translate%E3%82%A2%E3%83%8B%E3%83%A1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AB%E3%82%A4%E3%83%BC/

 

ダイアログメッセージを出す

AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setTitle("登録しました");

            builder.setNegativeButton("OK", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {

                    // 遷移
                    Intent intent = new Intent(getApplication(), testActivity.class);
                    startActivity(intent);

                }
            });

            // 表示
            builder.create().show();

これでウインドメッセージが出てきます。

“OK” を押した場合は、

			builder.setNegativeButton("OK", new DialogInterface.OnClickListener() {
				@Override
				public void onClick(DialogInterface dialog, int which) {

					// 遷移
					Intent intent = new Intent(getApplication(), G_2_0_4_SeijinshikiActivity.class);
					startActivity(intent);

				}
			});

この中にかくといいよ!

でもダイアログ以外をおしたときは、どう判定すればいいのか、、、、