国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 系統(tǒng) > Android > 正文

Android實(shí)現(xiàn)微博菜單彈出效果

2019-12-12 02:26:52
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

先上Android仿微博菜單彈出效果圖,這個(gè)截圖不是很流暢,大家可以下載apk試一下。

 

說(shuō)一下實(shí)現(xiàn)思路:

1、截取當(dāng)前窗口,對(duì)圖片做高斯模糊處理,將處理后的圖片做popupwindow的背景圖片;
2、創(chuàng)建popupwindow,完成布局,這兒要注意:View的移動(dòng)范圍是由parent的大小決定的,就是只能在parent的范圍內(nèi)移動(dòng);
3、給買個(gè)View添加進(jìn)入動(dòng)畫,每個(gè)比前一個(gè)延期50ms播放動(dòng)畫,關(guān)閉窗口時(shí)相反;
4、為View的動(dòng)畫添加回彈插值器;

MoreWindow.java窗口

package com.jerome.weibo;  import android.animation.Animator; import android.animation.Animator.AnimatorListener; import android.animation.ObjectAnimator; import android.animation.ValueAnimator; import android.app.Activity; 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 android.widget.RelativeLayout.LayoutParams;  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,int bottomMargin) {   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);   android.widget.RelativeLayout.LayoutParams params =new android.widget.RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);   params.bottomMargin = bottomMargin;   params.addRule(RelativeLayout.BELOW, R.id.more_window_auto);   params.addRule(RelativeLayout.RIGHT_OF, R.id.more_window_collect);   params.topMargin = 200;   params.leftMargin = 18;   close.setLayoutParams(params);      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.more_window_local){     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.more_window_local:    break;   case R.id.more_window_online:    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();   }  }   } 

 KickBackAnimator.Java回彈效果:

package com.jerome.weibo;  import android.animation.TypeEvaluator;  public class KickBackAnimator implements TypeEvaluator<Float> {  private final float s = 1.70158f;  float mDuration = 0f;   public void setDuration(float duration) {   mDuration = duration;  }   public Float evaluate(float fraction, Float startValue, Float endValue) {   float t = mDuration * fraction;   float b = startValue.floatValue();   float c = endValue.floatValue() - startValue.floatValue();   float d = mDuration;   float result = calculate(t, b, c, d);   return result;  }   public Float calculate(float t, float b, float c, float d) {   return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b;  } } 

代碼見github: https://github.com/gqdy365/WeiboPopupWindow

請(qǐng)大家star一下,我后面會(huì)持續(xù)更新;

下面是apk下載地址:WeiboPopupWindow

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 龙南县| 昭觉县| 昌宁县| 谷城县| 曲松县| 宁蒗| 阿克苏市| 天台县| 中阳县| 东安县| 澄江县| 开化县| 武汉市| 弥渡县| 易门县| 平阴县| 洪雅县| 浦县| 安溪县| 中西区| 曲沃县| 正定县| 平乡县| 阳谷县| 灵台县| 新干县| 永春县| 榆社县| 广昌县| 新野县| 武鸣县| 揭东县| 韶关市| 旺苍县| 田东县| 宽甸| 海门市| 沅陵县| 平湖市| 贵溪市| 宝应县|