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);
}
});
この中にかくといいよ!
でもダイアログ以外をおしたときは、どう判定すればいいのか、、、、
