Created
December 18, 2017 03:41
-
-
Save happycodinggirl/4b16be9464300bfb36c5cfce65935aff to your computer and use it in GitHub Desktop.
android WindowManager addView 仿悬浮式通知栏 http://www.jianshu.com/p/24e79773f143
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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