package com.anthony.imagepicker.view; import android.animation.Animator; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.content.Context; import android.graphics.drawable.ColorDrawable; import android.view.View; import android.view.ViewGroup; import android.view.ViewTreeObserver; import android.view.animation.AccelerateDecelerateInterpolator; import android.widget.AdapterView; import android.widget.BaseAdapter; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.PopupWindow; import com.anthony.imagepicker.R; /** * ================================================ * 作 者:jeasonlzy(廖子尧)Github地址:https://github.com/jeasonlzy0216 * 版 本:1.0 * 创建日期:16/8/1 * 描 述: * 修订历史: * ================================================ */ public class FolderPopUpWindow extends PopupWindow implements View.OnClickListener { private ListView listView; private OnItemClickListener onItemClickListener; private final View masker; private final View marginView; private int marginPx; public FolderPopUpWindow(Context context, BaseAdapter adapter) { super(context); final View view = View.inflate(context, R.layout.pop_folder, null); masker = view.findViewById(R.id.masker); masker.setOnClickListener(this); marginView = view.findViewById(R.id.margin); marginView.setOnClickListener(this); listView = (ListView) view.findViewById(R.id.listView); listView.setAdapter(adapter); setContentView(view); setWidth(ViewGroup.LayoutParams.MATCH_PARENT); //如果不设置,就是 AnchorView 的宽度 setHeight(ViewGroup.LayoutParams.MATCH_PARENT); setFocusable(true); setOutsideTouchable(true); setBackgroundDrawable(new ColorDrawable(0)); setAnimationStyle(0); view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { view.getViewTreeObserver().removeGlobalOnLayoutListener(this); int maxHeight = view.getHeight() * 5 / 8; int realHeight = listView.getHeight(); ViewGroup.LayoutParams listParams = listView.getLayoutParams(); listParams.height = realHeight > maxHeight ? maxHeight : realHeight; listView.setLayoutParams(listParams); LinearLayout.LayoutParams marginParams = (LinearLayout.LayoutParams) marginView.getLayoutParams(); marginParams.height = marginPx; marginView.setLayoutParams(marginParams); enterAnimator(); } }); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) { if (onItemClickListener != null) onItemClickListener.onItemClick(adapterView, view, position, l); } }); } private void enterAnimator() { ObjectAnimator alpha = ObjectAnimator.ofFloat(masker, "alpha", 0, 1); ObjectAnimator translationY = ObjectAnimator.ofFloat(listView, "translationY", listView.getHeight(), 0); AnimatorSet set = new AnimatorSet(); set.setDuration(400); set.playTogether(alpha, translationY); set.setInterpolator(new AccelerateDecelerateInterpolator()); set.start(); } @Override public void dismiss() { exitAnimator(); } private void exitAnimator() { ObjectAnimator alpha = ObjectAnimator.ofFloat(masker, "alpha", 1, 0); ObjectAnimator translationY = ObjectAnimator.ofFloat(listView, "translationY", 0, listView.getHeight()); AnimatorSet set = new AnimatorSet(); set.setDuration(300); set.playTogether(alpha, translationY); set.setInterpolator(new AccelerateDecelerateInterpolator()); set.addListener(new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator animation) { listView.setVisibility(View.VISIBLE); } @Override public void onAnimationEnd(Animator animation) { FolderPopUpWindow.super.dismiss(); } @Override public void onAnimationCancel(Animator animation) { } @Override public void onAnimationRepeat(Animator animation) { } }); set.start(); } public void setOnItemClickListener(OnItemClickListener listener) { this.onItemClickListener = listener; } public void setSelection(int selection) { listView.setSelection(selection); } public void setMargin(int marginPx) { this.marginPx = marginPx; } @Override public void onClick(View v) { dismiss(); } public interface OnItemClickListener { void onItemClick(AdapterView<?> adapterView, View view, int position, long l); } }