91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android實現微博菜單彈出效果

發布時間:2020-08-23 07:48:12 來源:腳本之家 閱讀:197 作者:gqdy365 欄目:移動開發

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

 Android實現微博菜單彈出效果

說一下實現思路:

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

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

請大家star一下,我后面會持續更新;

下面是apk下載地址:WeiboPopupWindow

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

弥渡县| 磴口县| 镇原县| 高青县| 东莞市| 资兴市| 资中县| 通化县| 鸡东县| 施甸县| 鹤岗市| 略阳县| 东平县| 遵义县| 博爱县| 和龙市| 临颍县| 县级市| 漾濞| 达孜县| 福贡县| 金乡县| 思南县| 宣威市| 乌苏市| 池州市| 五河县| 巢湖市| 额济纳旗| 盘锦市| 永年县| 黄龙县| 玉溪市| 竹北市| 新绛县| 梅州市| 鹰潭市| 洞头县| 泰州市| 遂川县| 万州区|