Skip to content

Instantly share code, notes, and snippets.

@happycodinggirl
Created December 18, 2017 03:41
Show Gist options
  • Save happycodinggirl/4b16be9464300bfb36c5cfce65935aff to your computer and use it in GitHub Desktop.
Save happycodinggirl/4b16be9464300bfb36c5cfce65935aff to your computer and use it in GitHub Desktop.
android WindowManager addView 仿悬浮式通知栏 http://www.jianshu.com/p/24e79773f143
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.content.Context;
import android.content.Intent;
import android.graphics.PixelFormat;
import android.os.Handler;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.view.animation.LinearInterpolator;
import android.view.animation.OvershootInterpolator;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.txzkj.onlinebookedcar.R;
import com.txzkj.onlinebookedcar.constants.Constants;
import com.txzkj.onlinebookedcar.data.entity.SendedOrder;
import com.txzkj.onlinebookedcar.views.activities.TravelActivity;
import com.txzkj.utils.LogUtil;
import static android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
import static com.txzkj.onlinebookedcar.map.MultiAMapNaviListener_New.TAG;
/**
* Created by Administrator on 2017/10/23.
*/
public class NotificationHelper {
Context context;
private WindowManager windowManager;
private WindowManager.LayoutParams layoutParams;
public boolean isViewAdded;
private LinearLayout linearNoti;
private FrameLayout layout;
private float downX;
private float downY;
//private final int touchSlop;
int screenWidth;
private final TextView tvOrderInfo;
private int layoutHeight;
public NotificationHelper(final Context context) {
this.context = context;
LayoutInflater inflater = LayoutInflater.from(context);
layout = (FrameLayout) inflater.inflate(R.layout.layout_order_notification, null)
.findViewById(R.id.notificationbg);
linearNoti = (LinearLayout) layout.findViewById(R.id.linearNotification);
tvOrderInfo = (TextView) linearNoti.findViewById(R.id.tvOrderInfo);
screenWidth=Util.getScreenWidth(context);
layout.post(new Runnable() {
@Override
public void run() {
layoutHeight =layout.getHeight();
LogUtil.d("-->layoutHeight is "+layoutHeight);
layout.setTranslationY(-layoutHeight);
}
});
windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
layoutParams = new WindowManager.LayoutParams(WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_PRIORITY_PHONE,
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS |WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL|FLAG_NOT_FOCUSABLE, PixelFormat.TRANSLUCENT);
layoutParams.gravity = Gravity.TOP | Gravity.CENTER_HORIZONTAL;
layoutParams.x=0;
layoutParams.y=0;
layoutParams.verticalMargin=0;
layout.setClipChildren(false);
layout.setClipToPadding(false);
linearNoti.setOnTouchListener(new View.OnTouchListener() {
@Override public boolean onTouch(View view, MotionEvent motionEvent) {
switch (motionEvent.getAction()) {
case MotionEvent.ACTION_DOWN:
downX = motionEvent.getRawX();
downY = motionEvent.getRawY();
return true;
case MotionEvent.ACTION_MOVE:
break;
case MotionEvent.ACTION_UP:
float upX = motionEvent.getRawX();
float upY = motionEvent.getRawY();
float yDis=downY-upY;
float xDis=upX-downX;
Log.d(TAG, "onTouch: xDis is "+xDis+" yDis is "+yDis);
if (yDis >Util.dip2px(context,20)){//up scroll
animUpDismiss();
}else if (xDis>yDis&&xDis>Util.dip2px(context,20)){ //right fingle
animRightDismiss();
}else if (Math.abs(xDis)>Math.abs(yDis)&&xDis<0&&Math.abs(xDis)>Util.dip2px(context,20)){//left fingle
animLeftDismiss();
}
break;
} return false;
}
});
}
public void addViewToWindowManager(final SendedOrder sendedOrder) {
tvOrderInfo.setText("预约 "+"从"+sendedOrder.getStart_address()+" - "+sendedOrder.getEnd_address());
/* tvOrderInfo.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toaster.showDebugToast("linearNoti is clicked");
context.startActivity(new Intent(context, TravelActivity.class).putExtra(Constants.KEY_ORDERINFO,sendedOrder).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
removeNotification();
}
});*/
if (!isViewAdded) {
animShow();
isViewAdded = true;
}
}
public void addTestInfo(String content){
tvOrderInfo.setText(content);
/* tvOrderInfo.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toaster.showDebugToast("linearNoti is clicked");
context.startActivity(new Intent(context, TravelActivity.class).putExtra(Constants.KEY_ORDERINFO,sendedOrder).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
removeNotification();
}
});*/
if (!isViewAdded) {
animShow();
isViewAdded = true;
}
}
public void updateTestInfo(String content){
tvOrderInfo.setText(content);
}
public void removeNotification() {
if (isViewAdded) {
try {
windowManager.removeViewImmediate(layout);
}catch (Exception e){
LogUtil.e("-->removeViewException is "+e.getMessage());
}
isViewAdded = false;
}
}
// final SwipeDismissTouchListener dismissTouchListener;
private void animUpDismiss() {
try {
layout.animate().setDuration(500).alpha(0.0f).translationY(-layoutHeight).setInterpolator( new LinearInterpolator() ).setListener(new AnimatorListenerAdapter() {
@Override public void onAnimationEnd(Animator animation) {
removeNotification();
}
}).start();
} catch (Exception e) {
e.printStackTrace();
layout.setVisibility(View.GONE);
}
}
private void animRightDismiss(){
layout.animate().setDuration(700).alpha(0).translationX(screenWidth).setInterpolator( new LinearInterpolator() ).setListener(new AnimatorListenerAdapter() {
@Override public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
layout.setVisibility(View.GONE);
layout.setTranslationY(-300);
layout.setTranslationX(0);
removeNotification();
}
}).start();
}
private void animLeftDismiss(){
layout.animate().setDuration(700).alpha(0).translationX(-screenWidth).setInterpolator( new LinearInterpolator() ).setListener(new AnimatorListenerAdapter() {
@Override public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
layout.setVisibility(View.GONE);
layout.setTranslationY(-300);
layout.setTranslationX(0);
removeNotification();
}
}).start();
}
Handler handler = new Handler();
private void animShow() {
try {
windowManager.addView(layout, layoutParams);
layout.requestFocus();
layout.animate()
.setDuration(500)
.alpha(1)
.translationY(0)
.translationX(0).setInterpolator( new OvershootInterpolator() )
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationStart(Animator animation) {
super.onAnimationStart(animation);
layout.setVisibility(View.VISIBLE);
}
@Override public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
handler.postDelayed(new Runnable() {
@Override public void run() {
animUpDismiss();
}
}, 10000);
}
}).start();
} catch (NullPointerException npe) {
LogUtil.e("-->animShow is " + npe.getMessage());
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment