从底部弹出的PopupWindow

嗯哼,最近有个新的需求,需要做一个从底部弹出的popupWindow,让Android向ios看齐。。。

本来Android的是右上角弹出一个pop就好了。。。

首先是简单的布局,一个LinearLayout下放三个textview

"http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    "@+id/tv_bottom_up_first_item"
        android:text="@string/first_item"
        android:gravity="center"
        android:background="@drawable/text_bg"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="20dp"
        android:layout_marginBottom="6dp"
        android:layout_width="match_parent"
        android:layout_height="40dp" />

    "@+id/tv_bottom_up_second_item"
        android:text="@string/second_item"
        android:gravity="center"
        android:background="@drawable/text_bg"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="20dp"
        android:layout_marginBottom="6dp"
        android:layout_width="match_parent"
        android:layout_height="40dp" />

    "@+id/tv_bottom_up_third_item"
        android:text="@string/third_item"
        android:gravity="center"
        android:background="@drawable/text_bg"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="20dp"
        android:layout_marginBottom="6dp"
        android:layout_width="match_parent"
        android:layout_height="40dp" />

</LinearLayout>

Textview的background如下:

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#f4f2f2"/>
    <corners android:radius="15dp"/>
    <padding
        android:left="5dp"
        android:top="5dp"
        android:right="5dp"
        android:bottom="5dp"
        />

    <stroke
        android:color="#ffffff"
        android:width="2dp"
        />
shape>

接着写popupwindow的出场和消失动画:
在res下新建一个anim文件夹,分别写出场和消失的动画
出场动画如下:

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false">

    <translate
        android:fromYDelta="100%p"
        android:toYDelta="0"
        android:duration="300"
        />

    <alpha
        android:fromAlpha="0"
        android:toAlpha="1.0"
        android:duration="200"
        />

set>

消失动画差不多:

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false"
    >

    <translate
        android:fromYDelta="0"
        android:toYDelta="100%p"
        android:duration="300"
        />

    <alpha
        android:fromAlpha="1.0"
        android:toAlpha="0"
        android:duration="200"
        />

set>

在values的style文件下写:两个anim后面的名字是刚才定义的出场和消失动画的文件名

最后贴上popupWindow的代码:

public class BottomUpPopView extends PopupWindow {

    private TextView mFirstItem;
    private TextView mSecondItem;
    private TextView mThirdItem;
    private Activity mActivity;
    private View mView;
    private List mItemNames;
    private final LayoutInflater minflater;
    View.OnClickListener mItemClickListener;

    /**
     *
     * @param activity
     * @param mItemNames item的名字
     * @param itemClickListener view.onClickListener
     */
    public BottomUpPopView(Activity activity,List mItemNames,View.OnClickListener itemClickListener) {
        this.mItemNames = mItemNames;
        this.mActivity = activity;
        mItemClickListener = itemClickListener;
        minflater = activity.getLayoutInflater();
        init();
    }

    private void init(){
        mView = minflater.inflate(R.layout.pop_bottom_up,null);
        mFirstItem = mView.findViewById(R.id.tv_bottom_up_first_item);
        mSecondItem = mView.findViewById(R.id.tv_bottom_up_second_item);
        mThirdItem = mView.findViewById(R.id.tv_bottom_up_third_item);

        mFirstItem.setText(mItemNames.get(0));
        mSecondItem.setText(mItemNames.get(1));
        mThirdItem.setText(mItemNames.get(2));

        mFirstItem.setOnClickListener(mItemClickListener);
        mSecondItem.setOnClickListener(mItemClickListener);
        mThirdItem.setOnClickListener(mItemClickListener);

        //设置pop的参数
        this.setContentView(mView);
        this.setWidth(ViewGroup.LayoutParams.MATCH_PARENT);
        this.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
        this.setFocusable(true);
        this.setOutsideTouchable(true);
        this.update();
        this.setAnimationStyle(R.style.Animation);

        //当pop消失的时候就不用再做处理了
        this.setOnDismissListener(new OnDismissListener() {
            @Override
            public void onDismiss() {
                backgroundAlpha(1.0f);
            }
        });



    }

    public void backgroundAlpha(float bgAlpha)
    {
        WindowManager windowManager = mActivity.getWindowManager();
        WindowManager.LayoutParams lp = mActivity.getWindow().getAttributes();
        lp.alpha = bgAlpha; //0.0-1.0
        mActivity.getWindow().setAttributes(lp);
    }
}

其中backgroundAlpha方法的作用是让popupwindow出现和消失的时候,整个屏幕变暗和恢复
设置为1.0的时候代表屏幕正常显示。
最后看一下使用:(这里用的是kotlin,尝试一下Kotlin和Java的结合)

class MainActivity : AppCompatActivity() {

    private var mButton: Button? = null
    private var mPopView: BottomUpPopView? = null

    private val mItemClickListener = View.OnClickListener { v ->
        when (v.id) {
            R.id.tv_bottom_up_first_item -> {
                Toast.makeText(this@MainActivity, "点击了第一个item", Toast.LENGTH_SHORT).show()
            }
            R.id.tv_bottom_up_second_item -> {
                Toast.makeText(this@MainActivity,"点击了第二个item",Toast.LENGTH_SHORT).show()
            }
            R.id.tv_bottom_up_third_item ->{
                Toast.makeText(this@MainActivity,"点击了第三个item",Toast.LENGTH_SHORT).show()
            }
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        mButton = findViewById

你可能感兴趣的:(Android)