最近做一個類似微博的彈出效果,但是自己修改了修改彈出以後的界面樣式。可以運用,大家參考即可。
Demo的實現效果是微博的樣式,下面有demo的下載地址。而下圖顯示是我自己寫的實現的效果如下圖所示:
網絡上找的封裝好的MoreWindow.class類:
package com.kegoal.activity.weibo; import android.animation.Animator; import android.animation.Animator.AnimatorListener; import android.animation.ObjectAnimator; import android.animation.ValueAnimator; import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Rect; import android.graphics.drawable.BitmapDrawable; import android.os.Handler; import android.util.DisplayMetrics; import android.util.Log; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.view.animation.Animation; import android.view.animation.Animation.AnimationListener; import android.view.animation.AnimationSet; import android.view.animation.TranslateAnimation; import android.widget.ImageView; import android.widget.PopupWindow; import android.widget.RelativeLayout; import com.kegoal.activity.R; import com.kegoal.activity.my.MyActivity; public class MoreWindow extends PopupWindow implements OnClickListener { private String TAG = MoreWindow.class.getSimpleName(); Activity mContext; private int mWidth; private int mHeight; private int statusBarHeight; private Bitmap mBitmap = null; private Bitmap overlay = null; private Handler mHandler = new Handler(); public MoreWindow(Activity context) { mContext = context; } public void init() { Rect frame = new Rect(); mContext.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame); statusBarHeight = frame.top; DisplayMetrics metrics = new DisplayMetrics(); mContext.getWindowManager().getDefaultDisplay() .getMetrics(metrics); mWidth = metrics.widthPixels; mHeight = metrics.heightPixels; setWidth(mWidth); setHeight(mHeight); } private Bitmap blur() { if (null != overlay) { return overlay; } long startMs = System.currentTimeMillis(); View view = mContext.getWindow().getDecorView(); view.setDrawingCacheEnabled(true); view.buildDrawingCache(true); mBitmap = view.getDrawingCache(); float scaleFactor = 8; float radius = 10; int width = mBitmap.getWidth(); int height = mBitmap.getHeight(); overlay = Bitmap.createBitmap((int) (width / scaleFactor), (int) (height / scaleFactor), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(overlay); canvas.scale(1 / scaleFactor, 1 / scaleFactor); Paint paint = new Paint(); paint.setFlags(Paint.FILTER_BITMAP_FLAG); canvas.drawBitmap(mBitmap, 0, 0, paint); overlay = FastBlur.doBlur(overlay, (int) radius, true); Log.i(TAG, "blur time is:" + (System.currentTimeMillis() - startMs)); return overlay; } private Animation showAnimation1(final View view, int fromY, int toY) { AnimationSet set = new AnimationSet(true); TranslateAnimation go = new TranslateAnimation(0, 0, fromY, toY); go.setDuration(300); TranslateAnimation go1 = new TranslateAnimation(0, 0, -10, 2); go1.setDuration(100); go1.setStartOffset(250); set.addAnimation(go1); set.addAnimation(go); set.setAnimationListener(new AnimationListener() { @Override public void onAnimationEnd(Animation animation) { } @Override public void onAnimationRepeat(Animation animation) { } @Override public void onAnimationStart(Animation animation) { } }); return set; } public void showMoreWindow(View anchor) { final RelativeLayout layout = (RelativeLayout) LayoutInflater.from(mContext).inflate(R.layout.center_music_more_window, null); setContentView(layout); ImageView close = (ImageView) layout.findViewById(R.id.center_music_window_close); close.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (isShowing()) { closeAnimation(layout); } } }); showAnimation(layout); setBackgroundDrawable(new BitmapDrawable(mContext.getResources(), blur())); setOutsideTouchable(true); setFocusable(true); showAtLocation(anchor, Gravity.BOTTOM, 0, statusBarHeight); } private void showAnimation(ViewGroup layout) { for (int i = 0; i < layout.getChildCount(); i++) { final View child = layout.getChildAt(i); if (child.getId() == R.id.center_music_window_close) { continue; } child.setOnClickListener(this); child.setVisibility(View.INVISIBLE); mHandler.postDelayed(new Runnable() { @Override public void run() { child.setVisibility(View.VISIBLE); ValueAnimator fadeAnim = ObjectAnimator.ofFloat(child, "translationY", 600, 0); fadeAnim.setDuration(300); KickBackAnimator kickAnimator = new KickBackAnimator(); kickAnimator.setDuration(150); fadeAnim.setEvaluator(kickAnimator); fadeAnim.start(); } }, i * 50); } } private void closeAnimation(ViewGroup layout) { for (int i = 0; i < layout.getChildCount(); i++) { final View child = layout.getChildAt(i); if (child.getId() == R.id.center_music_window_close) { continue; } child.setOnClickListener(this); mHandler.postDelayed(new Runnable() { @Override public void run() { child.setVisibility(View.VISIBLE); ValueAnimator fadeAnim = ObjectAnimator.ofFloat(child, "translationY", 0, 600); fadeAnim.setDuration(200); KickBackAnimator kickAnimator = new KickBackAnimator(); kickAnimator.setDuration(100); fadeAnim.setEvaluator(kickAnimator); fadeAnim.start(); fadeAnim.addListener(new AnimatorListener() { @Override public void onAnimationStart(Animator animation) { // TODO Auto-generated method stub } @Override public void onAnimationRepeat(Animator animation) { // TODO Auto-generated method stub } @Override public void onAnimationEnd(Animator animation) { child.setVisibility(View.INVISIBLE); } @Override public void onAnimationCancel(Animator animation) { // TODO Auto-generated method stub } }); } }, (layout.getChildCount() - i - 1) * 30); if (child.getId() == R.id.text_personal_center) { mHandler.postDelayed(new Runnable() { @Override public void run() { dismiss(); } }, (layout.getChildCount() - i) * 30 + 80); } } } @Override public void onClick(View v) { switch (v.getId()) { case R.id.text_personal_center: v.getContext().startActivity(new Intent(v.getContext(), MyActivity.class)); break; case R.id.text_make_plan: v.getContext().startActivity(new Intent(v.getContext(), MyActivity.class)); break; // case R.id.more_window_delete: // break; // case R.id.more_window_collect: // break; // case R.id.more_window_auto: // break; // case R.id.more_window_external: // break; default: break; } } public void destroy() { if (null != overlay) { overlay.recycle(); overlay = null; System.gc(); } if (null != mBitmap) { mBitmap.recycle(); mBitmap = null; System.gc(); } } }而對應的我們彈出的界面的佈局,如下center_music_more_window.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_centerHorizontal="true" android:background="@android:color/transparent"> <TextView android:id="@+id/text_personal_center" android:layout_width="wrap_content" android:layout_height="40dp" android:layout_alignParentBottom="true" android:layout_marginBottom="170dp" android:layout_marginLeft="15dp" android:drawableLeft="@mipmap/add_address_non" android:drawablePadding="15dp" android:gravity="center_vertical" android:text="個人信息" /> <TextView android:id="@+id/text_make_plan" android:layout_width="wrap_content" android:layout_height="40dp" android:layout_alignParentBottom="true" android:layout_marginBottom="100dp" android:layout_marginLeft="15dp" android:drawableLeft="@mipmap/close_btn_pre" android:drawablePadding="15dp" android:gravity="center_vertical" android:text="個人信息2" /> <ImageView android:id="@+id/center_music_window_close" android:layout_width="40dp" android:layout_height="40dp" android:layout_alignParentBottom="true" android:layout_marginBottom="30dp" android:layout_marginLeft="15dp" android:src="@mipmap/close_btn" /> </RelativeLayout>在自己需要彈出這個效果的地方,添加如下代碼:
private void showMoreWindow(View view) { if (null == mMoreWindow) { mMoreWindow = new MoreWindow(this); mMoreWindow.init(); } mMoreWindow.showMoreWindow(view); }
public void onClick(View v) { switch (v.getId()) { case R.id.show: showMoreWindow(v); break; }showMoreWindow方法,然後點擊按鈕調用。即可。
點擊時間,我們在MoreWindow中已經定義,需要得到一定的注意。
從自定義的window跳轉到指定的activity,我們使用的v.getContext()。大家可以參考使用。驗證已經通過。
仿微博Demo的參考下載地址:點擊打開鏈接