从底部弹出的PopupWindow

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

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

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

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

    <TextView
        android:id="@+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" />

    <TextView
        android:id="@+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" />

    <TextView
        android:id="@+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后面的名字是刚才定义的出场和消失动画的文件名

<style name="Animation">
        <item name="android:windowEnterAnimation">@anim/enter_up</item>
        <item name="android:windowExitAnimation">@anim/out_down</item>
    </style>

最后贴上popupWindow的代码:

public class BottomUpPopView extends PopupWindow {

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

    /**
     *
     * @param activity
     * @param mItemNames item的名字
     * @param itemClickListener view.onClickListener
     */
    public BottomUpPopView(Activity activity,List<String> 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<Button>(R.id.btn_pop) //查找控件的方式一

        val mNames = ArrayList<String>()
        mNames.add("赞同")
        mNames.add("反对")
        mNames.add("弃权")


        mPopView = BottomUpPopView(this,mNames,mItemClickListener)

        //查找控件的方式二:直接对应xml中的用户名
        btn_pop.setOnClickListener { _ ->
            mPopView?.showAtLocation(findViewById(R.id.cl_main), Gravity.BOTTOM or Gravity.CENTER_HORIZONTAL,0,0)
            mPopView?.backgroundAlpha(0.5f)
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值