iOS + PHPでPush Notificationを実装する、の参考サイト
月: 2016年3月
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<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); } });
Activity、Intentのことについて(いろんなオプション)
こちらを参考にして、
intent.setFlagsメソッドの引数について
定数 | 内容 |
---|---|
FLAG_ACTIVITY_NEW_TASK | 常に新しいタスクで起動する ※デフォルト |
FLAG_ACTIVITY_SINGLE_TOP | 現在のActivityと同じアクティビティは起動しない |
FLAG_ACTIVITY_CLEAR_TOP | スタックをクリアしてから起動する |
FLAG_ACTIVITY_NO_ANIMATION | トランジションアニメーションを行わずに起動する |
FLAG_ACTIVITY_NO_HISTORY | スタックに追加せずに起動する |
FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY | スタック内のActivityを利用して起動する(使いまわす) |
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS | 履歴内の同一Acrivityを利用して起動する(使いまわす) |
FLAG_ACTIVITY_PREVIOUS_IS_TOP | 呼び出し元のActivityをタスクのトップと見なして起動する |
FLAG_ACTIVITY_REORDER_TO_FRONT | スタック内の同一Activityを最前面に移動させる |
画面を遷移するときなどにこれを渡せばいいらしい。使い方は以下のような、
// 引数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”
なども考慮するといいかもしれない。
また一つ賢くなったね!!
DiffMerge
二つのフォルダー内のファイルを見比べるときはDiffMergeをつかう
アラートダイアログの外側を押せないようにする
アラートダイアログの外側を押せないようにする、ダイアログは便利ですが外側を押しても反応しちゃう。
そこで
// ダイアログ表示 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(); }
FuelPHPをレンタルサーバーにいれこむ
Googleスプレッドシートを利用したGASのAPIを誰でも使えるようにする
Javaでマッチング、正規表現のとき、$1 $2 とか使いたいじゃん
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; }
数値文字列に0を加えて桁数を同じにしたい、文字列加工したい
よく使うタイマーの流れ
タイマーをよく使うのですが、備忘録として。
// タイマー作動 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() { } に処理をかきます。それが実行されます。
WebViewを使用したときに外部ブラウザにジャンプさせない
ストレージに画像保存するためのクラス
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で設置したレイアウトを丸ごと渡したい
ボタンを半透明化ぁああああ
レイアウトとか、ボタンとか、あちこちアニメーションしたいよね!
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つ使用するだけでいけるので、ちょびっとアニメーションしたいときなんか簡単でいいですよね。
ダイアログメッセージを出す
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); } });
この中にかくといいよ!
でもダイアログ以外をおしたときは、どう判定すればいいのか、、、、