Android 如何从屏幕底部向上滑出一个view
我的实现方式是使用Android 中的dialog实现的,直接看下面的代码步骤
1、定义dialog的布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/bg_layout_border_shop"
android:orientation="vertical">
<!--名称+价格-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="15dp"
android:background="@drawable/bg_layout_border_shop"
android:orientation="horizontal">
<TextView
android:id="@+id/tv_home_shop_dishes_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/colorBlack"
android:textSize="16sp"
android:text="蛋卷"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"/>
<TextView
android:id="@+id/tv_home_shop_price"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="16sp"
android:textColor="@color/colorOrange"
android:text="5元/包"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/bg_layout_border_shop"
android:padding="15dp"
android:orientation="vertical">
<TextView
android:textSize="16sp"
android:textColor="@color/colorBlack"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="份量"/>
<RadioGroup
android:id="@+id/rg_register_sex"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginTop="10dp"
android:layout_centerVertical="true">
<RadioButton
android:id="@+id/rb_home_shop_lt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/selector_home_shop_border"
android:textColor="@drawable/selector_home_rb_text"
android:padding="8dp"
android:textSize="14sp"
android:layout_marginRight="8dp"
android:button="@null"
android:text="小份"/>
<RadioButton
android:id="@+id/rb_home_shop_eq"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/selector_home_shop_border"
android:textColor="@drawable/selector_home_rb_text"
android:padding="8dp"
android:textSize="14sp"
android:layout_marginRight="8dp"
android:button="@null"
android:text="中份"/>
<RadioButton
android:id="@+id/rb_home_shop_gt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/selector_home_shop_border"
android:textColor="@drawable/selector_home_rb_text"
android:padding="8dp"
android:textSize="14sp"
android:layout_marginRight="8dp"
android:button="@null"
android:text="大份"/>
</RadioGroup>
</LinearLayout>
<!--购买数量-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/bg_layout_border_shop"
android:padding="15dp"
android:orientation="horizontal">
<TextView
android:textColor="@color/colorBlack"
android:textSize="16sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="购买数量"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/bg_layout_sms_border"
android:orientation="horizontal">
<TextView
android:id="@+id/tv_shop_minus"
android:textColor="@color/colorBlack"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="4dp"
android:text=" - "/>
<EditText
android:id="@+id/et_shop_number"
android:layout_width="50dp"
android:background="@drawable/bg_layout_shop_border1"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="4dp"
android:text="1"/>
<TextView
android:id="@+id/tv_shop_plus"
android:textColor="@color/colorBlack"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="4dp"
android:text=" + "/>
</LinearLayout>
</LinearLayout>
<!--加入购物车-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp"
android:orientation="horizontal">
<TextView
android:id="@+id/tv_home_shop_price_num"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18sp"
android:layout_weight="1"
android:textColor="@color/colorOrange"
android:text="¥ 5 "/>
<Button
android:id="@+id/btn_shop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18sp"
android:background="@drawable/bg_layout_btn_radius_border"
android:textColor="@color/colorWhite"
android:padding="8dp"
android:text="加入购物车"/>
</LinearLayout>
</LinearLayout>
</ScrollView>
</LinearLayout>
2、定义一个类,然后直接继承dialog
package com.dx.jingle.dialog;
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.TextView;
import androidx.annotation.NonNull;
import com.dx.jingle.R;
import com.dx.jingle.bean.DishesVoBean;
import com.dx.jingle.bean.ShoppingCartBean;
import com.dx.jingle.util.MainUtil;
import java.math.BigDecimal;
public class HomeShopDialog extends Dialog {
private Context context;
private DishesVoBean dishesVo;
private OnItemClickListener onItemClickListener;
private String strShop;
public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
this.onItemClickListener = onItemClickListener;
}
public HomeShopDialog(@NonNull Context context, DishesVoBean dishesVos) {
super(context);
this.context=context;
this.dishesVo=dishesVo;
}
public HomeShopDialog(@NonNull Context context, int themeResId, DishesVoBean dishesVo) {
super(context, themeResId);
this.context=context;
this.dishesVo=dishesVo;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//设置布局
setContentView(R.layout.dialog_home_shop);
}
}
public interface OnItemClickListener{
void onBtnPlusClick(View view, ShoppingCartBean data, DishesVoBean datas);
}
}
3、然后自定义一个点击事件
//设置点击事件
rvReserveHomeAdapter.setOnItemClickListener(new RvReserveHomeAdapter.OnItemClickListener() {
@Override
public void onBtnPlusClick(View view, DishesVoBean data, int position) {
//1、初始化Dialog
HomeShopDialog dialog=new HomeShopDialog(mActivityContext,R.style.DialogTheme,data);
//获取Dialogwindow对象
Window window=dialog.getWindow();
//设置弹出位置
window.setGravity(Gravity.BOTTOM);
//设置动画
window.setWindowAnimations(R.style.dialog_menu_animStyle);
//设置对话框大小
window.getDecorView().setPadding(0,0,0,0);
WindowManager.LayoutParams layoutParams=window.getAttributes();
//设置宽度和高度
layoutParams.width= WindowManager.LayoutParams.MATCH_PARENT;
layoutParams.height=WindowManager.LayoutParams.WRAP_CONTENT;
//显示Dialog
dialog.show();
}
});
4、在styles.xml中设置dialog的样式
<!-- dialog的动画 -->
<style name="DialogTheme" parent="@android:style/Theme.Dialog">
<!-- 边框 -->
<item name="android:windowFrame">@null</item>
<!-- 是否浮现在activity之上 -->
<item name="android:windowIsFloating">true</item>
<!-- 半透明 -->
<item name="android:windowIsTranslucent">true</item>
<!-- 无标题 -->
<item name="android:windowNoTitle">true</item>
<item name="android:background">@android:color/transparent</item>
<!-- 背景透明 -->
<item name="android:windowBackground">@android:color/transparent</item>
<!-- 模糊 -->
<item name="android:backgroundDimEnabled">true</item>
<!-- 遮罩层 -->
<item name="android:backgroundDimAmount">0.5</item>
</style>
<!-- dialog的动画 -->
<style name="dialog_menu_animStyle">
<item name="android:windowEnterAnimation">@anim/dialog_in_anim</item>
<item name="android:windowExitAnimation">@anim/dialog_out_anim</item>
</style>
5、定义关闭与打开的动画效果
//结束
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="500"
android:fromXDelta="0"
android:fromYDelta="0%p"
android:toXDelta="0"
android:toYDelta="100%p" />
</set>
//打开
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<!--
有四种动画:alpha (透明变化) translate(位置移动) scale(缩放) rotate(旋转),
android:duration: 动画运行时间,定义在多次时间(ms)内完成动画
android:startOffset: 延迟一定时间后运行动画
fromXDelta: X轴方向开始位置,可以是%,也可以是具体的像素 具体见图
toXDelta: X轴方向结束位置,可以是%,也可以是具体的像素
fromYDelta: Y轴方向开始位置,可以是%,也可以是具体的像素
toYDelta: Y轴方向结束位置,可以是%,也可以是具体的像素
-->
<translate
android:duration="500"
android:fromXDelta="0"
android:fromYDelta="100%p"
android:toXDelta="0"
android:toYDelta="0%p" />
</set>
效果图: