Android仿一點資訊收藏Toast動畫效果(給Toast新增動畫效果)
阿新 • • 發佈:2019-01-09
最近在做一個項,有一個收藏的功能。後來看到了一點資訊的收藏動畫,可上下彈跳,並在螢幕中央顯示。感覺不錯,所有自己就實現了一下。
這是效果:
附上完整的程式碼,其中Animation_Toast為動畫:
public class CollectToast {
private static CollectToast toastCollectSucceed = null;
private Toast toast = null;
private TextView text;
private CollectToast() {}
/**
* 單例模式
*
* @return
*/
public static CollectToast createToast() {
if (toastCollectSucceed == null) {
toastCollectSucceed = new CollectToast();
}
return toastCollectSucceed;
}
/**
* 顯示Toast
*
* @param context
* @param root
* @param tvString
* @param result 是否成功
*/
public Toast showToast(Context context, ViewGroup root, String tvString, int duration, boolean result) {
toast = null;
int styleId = R.style.Animation_Toast;
if (toast == null) {
View layout = LayoutInflater.from(context).inflate(R.layout.toast_collect_layout, root);
text = (TextView) layout.findViewById(R.id.title_tv);
ImageView imageView = (ImageView) layout.findViewById(R.id.iv);
if (result)
imageView.setBackgroundDrawable(DrawableUtil.getImageDrawable(context, R.mipmap.doneicon_popup_textpage));
else
imageView.setBackgroundDrawable(DrawableUtil.getImageDrawable(context, R.mipmap.close_popup_textpage));
text.setText(tvString);
toast = new Toast(context);
toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
toast.setDuration(duration);
toast.setView(layout);
toast.show();
} else {
text.setText(tvString);
toast.show();
}
//通過反射給Toast設定動畫
try {
Object mTN = null;
mTN = getField(toast, "mTN");
if (mTN != null) {
Object mParams = getField(mTN, "mParams");
if (mParams != null
&& mParams instanceof WindowManager.LayoutParams) {
WindowManager.LayoutParams params = (WindowManager.LayoutParams) mParams;
params.windowAnimations = styleId;
}
}
} catch (Exception e) {
e.printStackTrace();
}
return toast;
}
/**
* 反射欄位
*
* @param object 要反射的物件
* @param fieldName 要反射的欄位名稱
* @return
* @throws NoSuchFieldException
* @throws IllegalAccessException
*/
private static Object getField(Object object, String fieldName) throws NoSuchFieldException, IllegalAccessException {
Field field = object.getClass().getDeclaredField(fieldName);
if (field != null) {
field.setAccessible(true);
return field.get(object);
}
return null;
}
}