Android仿支付宝支付从底部弹窗效果

我们再用支付宝支付的时候,会从底部弹上来一个对话框,让我们选择支付方式等等,今天我们就来慢慢实现这个功能

效果图

实现

主界面很简单,就是一个按钮,点击后跳到支付详情的Fragment中

package com.example.hfs.alipayuidemo; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; public class MainActivity extends AppCompatActivity { private Button mButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } private void initView() { mButton= (Button) this.findViewById(R.id.btn_pay); mButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { PayDetailFragment payDetailFragment=new PayDetailFragment(); payDetailFragment.show(getSupportFragmentManager(),"payDetailFragment"); } }); } }

接着是支付详情的Fragment代码

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/re_root" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#ffffff"> <!--==================================付款详情================================--> <RelativeLayout android:id="@+id/re_pay_detail" android:layout_width="match_parent" android:layout_height="fill_parent"> <ScrollView android:layout_width="match_parent" android:layout_height="wrap_content"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingBottom="15dp" android:paddingLeft="10dp" android:paddingRight="10dp" android:paddingTop="15dp"> <ImageView android:layout_width="10dp" android:layout_height="10dp" android:src="@mipmap/ic_close" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:text="订单详情" android:textSize="15sp" /> <ImageView android:layout_width="10dp" android:layout_height="10dp" android:layout_alignParentRight="true" android:src="@mipmap/ic_doubt" /> </RelativeLayout> <View android:layout_width="match_parent" android:layout_height="1dp" android:background="@color/line"/> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingBottom="15dp" android:paddingLeft="10dp" android:paddingRight="10dp" android:paddingTop="15dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="信用卡还款" android:textColor="@color/text_color_grey" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:text="农业银行" android:textColor="@color/text_color_grey" /> </RelativeLayout> <View android:layout_width="match_parent" android:layout_height="1dp" android:background="@color/line"/> <RelativeLayout android:id="@+id/re_pay_way" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingBottom="15dp" android:paddingLeft="10dp" android:paddingRight="10dp" android:paddingTop="15dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="支付方式" android:textColor="@color/text_color_grey" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:drawablePadding="10dp" android:drawableRight="@mipmap/ic_open" android:text="招商银行(尾号2345)" android:textColor="@color/text_color_grey" /> </RelativeLayout> <View android:layout_width="match_parent" android:layout_height="1dp" android:background="@color/line"/> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingBottom="15dp" android:paddingLeft="10dp" android:paddingRight="10dp" android:paddingTop="15dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="订单金额" android:textColor="@color/text_color_grey" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:text="10.00" android:textColor="@color/text_color_grey" /> </RelativeLayout> <View android:layout_width="match_parent" android:layout_height="1dp" android:background="@color/line"/> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingBottom="15dp" android:paddingLeft="10dp" android:paddingRight="10dp" android:paddingTop="15dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="需付款" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:text="10.00" /> </RelativeLayout> </LinearLayout> </ScrollView> <Button android:id="@+id/btn_confirm_pay" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_marginBottom="20dp" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:layout_marginTop="20dp" android:background="@drawable/btn_click" android:padding="10dp" android:text="确认付款" android:textColor="#ffffff" /> </RelativeLayout> <!--=================================付款方式======================================--> <LinearLayout android:id="@+id/lin_pay_way" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_toRightOf="@+id/re_pay_detail" android:background="#ffffff" android:orientation="vertical" android:visibility="gone"> <RelativeLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="#ffffff" android:padding="10dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:text="选择支付方式" /> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_margin="10dp" android:src="@mipmap/ic_close" /> </RelativeLayout> <View android:layout_width="match_parent" android:layout_height="1dp" android:background="@color/line"/> <ScrollView android:layout_width="fill_parent" android:layout_height="wrap_content"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <com.example.hfs.alipayuidemo.ScrollviewListView android:id="@+id/lv_bank" android:layout_width="fill_parent" android:layout_height="fill_parent" android:listSelector="#ffffff"/> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="1dp" android:background="#ffffff" android:drawableRight="@mipmap/ic_open" android:gravity="center_vertical" android:paddingBottom="15dp" android:paddingLeft="20dp" android:paddingRight="20dp" android:paddingTop="15dp" android:text="添加银行卡" /> <View android:layout_width="match_parent" android:layout_height="1dp" android:background="@color/line"/> <RelativeLayout android:id="@+id/re_balance" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="1dp" android:background="#ffffff" android:paddingBottom="10dp" android:paddingLeft="20dp" android:paddingTop="10dp"> <ImageView android:id="@+id/img_balance" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:src="@mipmap/ic_pay_banlance_able" /> <TextView android:id="@+id/tv_balance" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignTop="@+id/img_balance" android:layout_toRightOf="@+id/img_balance" android:paddingLeft="10dp" android:text="账户余额" android:textSize="13sp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/tv_balance" android:layout_toRightOf="@+id/img_balance" android:paddingLeft="10dp" android:text="可用活期账户500元" android:textSize="10sp" /> </RelativeLayout> </LinearLayout> </ScrollView> </LinearLayout> <!--====================================支付密码=========================================--> <LinearLayout android:id="@+id/lin_pass" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_toRightOf="@+id/re_pay_detail" android:visibility="gone" android:orientation="vertical"> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingBottom="15dp" android:paddingLeft="10dp" android:paddingRight="10dp" android:paddingTop="15dp"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@mipmap/ic_close" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:text="输入密码" /> </RelativeLayout> <View android:layout_width="match_parent" android:layout_height="1dp" android:background="@color/line"/> <EditText android:id="@+id/pass_view" android:layout_width="match_parent" android:layout_height="48dp" android:background="#ffffff" android:layout_marginLeft="40dp" android:layout_marginRight="40dp" android:layout_marginTop="10dp" /> <View android:layout_width="match_parent" android:layout_height="1dp" android:background="@color/line"/> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="right" android:padding="10dp" android:text="忘记密码" android:textColor="@color/colorstatus" android:textSize="12sp" /> </LinearLayout> </RelativeLayout> package com.example.hfs.alipayuidemo; import android.app.Dialog; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v4.app.DialogFragment; import android.view.Gravity; import android.view.View; import android.view.Window; import android.view.WindowManager; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.Button; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.RelativeLayout; /** * 底部弹窗Fragment */ public class PayDetailFragment extends DialogFragment { private RelativeLayout rePayWay, rePayDetail, reBalance; private LinearLayout LinPayWay,linPass; private ListView lv; private Button btnPay; private EditText gridPasswordView; @NonNull @Override public Dialog onCreateDialog(Bundle savedInstanceState) { // 使用不带Theme的构造器, 获得的dialog边框距离屏幕仍有几毫米的缝隙。 Dialog dialog = new Dialog(getActivity(), R.style.BottomDialog); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); // 设置Content前设定 dialog.setContentView(R.layout.fragment_pay_detail); dialog.setCanceledOnTouchOutside(true); // 外部点击取消 // 设置宽度为屏宽, 靠近屏幕底部。 final Window window = dialog.getWindow(); window.setWindowAnimations(R.style.AnimBottom); final WindowManager.LayoutParams lp = window.getAttributes(); lp.gravity = Gravity.BOTTOM; // 紧贴底部 lp.width = WindowManager.LayoutParams.MATCH_PARENT; // 宽度持平 lp.height = getActivity().getWindowManager().getDefaultDisplay().getHeight() * 3 / 5; window.setAttributes(lp); rePayWay = (RelativeLayout) dialog.findViewById(R.id.re_pay_way); rePayDetail = (RelativeLayout) dialog.findViewById(R.id.re_pay_detail);//付款详情 LinPayWay = (LinearLayout) dialog.findViewById(R.id.lin_pay_way);//付款方式 lv = (ListView) dialog.findViewById(R.id.lv_bank);//付款方式(银行卡列表) reBalance = (RelativeLayout) dialog.findViewById(R.id.re_balance);//付款方式(余额) btnPay = (Button) dialog.findViewById(R.id.btn_confirm_pay); gridPasswordView = (EditText) dialog.findViewById(R.id.pass_view); linPass = (LinearLayout)dialog.findViewById(R.id.lin_pass); rePayWay.setOnClickListener(listener); reBalance.setOnClickListener(listener); btnPay.setOnClickListener(listener); return dialog; } View.OnClickListener listener = new View.OnClickListener() { @Override public void onClick(View view) { Animation slide_left_to_left = AnimationUtils.loadAnimation(getActivity(), R.anim.slide_left_to_left); Animation slide_right_to_left = AnimationUtils.loadAnimation(getActivity(), R.anim.slide_right_to_left); Animation slide_left_to_right = AnimationUtils.loadAnimation(getActivity(), R.anim.slide_left_to_right); Animation slide_left_to_left_in = AnimationUtils.loadAnimation(getActivity(), R.anim.slide_left_to_left_in); switch (view.getId()) { case R.id.re_pay_way: rePayDetail.startAnimation(slide_left_to_left); rePayDetail.setVisibility(View.GONE); LinPayWay.startAnimation(slide_right_to_left); LinPayWay.setVisibility(View.VISIBLE); break; case R.id.re_balance: rePayDetail.startAnimation(slide_left_to_left_in); rePayDetail.setVisibility(View.VISIBLE); LinPayWay.startAnimation(slide_left_to_right); LinPayWay.setVisibility(View.GONE); break; case R.id.btn_confirm_pay: rePayDetail.startAnimation(slide_left_to_left); rePayDetail.setVisibility(View.GONE); linPass.startAnimation(slide_right_to_left); linPass.setVisibility(View.VISIBLE); break; default: break; } } }; }

还有一个ScrollView嵌套ListView的问题,主要是重写ListView的计算高度

package com.example.hfs.alipayuidemo; import android.content.Context; import android.util.AttributeSet; import android.widget.ListView; /** * ScrollView中嵌套ListView,重写ListView计算高度 */ public class ScrollviewListView extends ListView { public ScrollviewListView(Context context) { super(context); } public ScrollviewListView(Context context, AttributeSet attrs) { super(context, attrs); } public ScrollviewListView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); } }

好了,其实还是挺好理解的,附上GitHub项目地址: https://github.com/Greathfs/AliPayUiDemo

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

时间: 2024-07-31 22:36:57

Android仿支付宝支付从底部弹窗效果的相关文章

Android仿支付宝支付从底部弹窗效果_Android

我们再用支付宝支付的时候,会从底部弹上来一个对话框,让我们选择支付方式等等,今天我们就来慢慢实现这个功能 效果图 实现 主界面很简单,就是一个按钮,点击后跳到支付详情的Fragment中 package com.example.hfs.alipayuidemo; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.wi

Android仿支付宝支付密码输入框

本文实例为大家分享了Android实现一个仿支付宝支付密码的输入框,主要实现如下: PasswordView.java package com.jackie.alipay.password; import android.annotation.TargetApi; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphic

Android中PathMeasure仿支付宝支付动画

前言 在 Android 自定义 View 中,Path 可能用的比较多,PathMeasure 可能用的比较少,就我而言,以前也没有使用过 PathMeasure 这个 api,看到别人用 PathMeasure 和 ValueAnimator 结合在一起完成了很好的动画效果,于是我也学习下 PathMeasure ,此处记录下. PathMeasure 构造器: forceClosed 含义: // 创建一个 Path 对象 path = new Path(); path.moveTo(20

Android仿支付宝微信支付密码界面弹窗封装dialog

一,功能效果 二,实现过程 1,先写xml文件:dialog_keyboard.xml 注意事项 (1),密码部分用的是一个线性布局中6个TextView,并设置android:inputType="numberPassword",外框是用的一个有stroke属性的shape, (2),1-9数字是用的recycleview ,每个item的底部和右边有1dp的黑线,填充后形成分割线. (3),recycleview 要设置属性  android:overScrollMode=&quo

android仿支付宝付款成功及&amp;quot;天女散花&amp;quot;效果实现——看PathMeasure大展身手

话说,在前面两篇文章中,我们学习了BitmapShader.Path的基本使用,那么这一篇文章,咱们接着来学习一下PathMeasure的用法.什么,你没听说过PathMeasure?那你就要OUT咯~ 项目效果图 废话不多说,在开始讲解之前,先看下最终实现的效果. 效果一: 仿支付宝支付成功效果 效果二: 这两个项目都是使用Path和PathMeature配合完成的,由其他项目改造而来 项目一是七叔写的,我对代码进行了大量改造. 项目二是不小心搜到的,然后进行了改造,原文请戳这里 本文代码请到

Android仿支付宝中余额宝的数字动画效果_Android

实现效果图: 下面是具体代码,可直接复制: package com.lcw.rabbit.widget; import android.animation.ObjectAnimator; import android.content.Context; import android.text.TextUtils; import android.util.AttributeSet; import android.view.animation.AccelerateDecelerateInterpola

Android 仿支付宝密码输入框效果_Android

模仿支付宝输入效果,实现很简单,就是画个矩形框和圆形,其他的通过组合view来实现所有功能,虽然简单但是封装起来,方便以后使用,也分享一下,希望对别人也有点帮助.   1.如何使用,可以设置自己的进入退出动画,不设置则没有动画效果,自己觉得封装之后还是非常用好的. private MyInputPwdUtil myInputPwdUtil; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(

Android仿支付宝中余额宝的数字动画效果

实现效果图: 下面是具体代码,可直接复制: package com.lcw.rabbit.widget; import android.animation.ObjectAnimator; import android.content.Context; import android.text.TextUtils; import android.util.AttributeSet; import android.view.animation.AccelerateDecelerateInterpola

Android仿支付宝笑脸刷新加载动画的实现代码_Android

看到支付宝的下拉刷新有一个笑脸的动画,因此自己也动手实现一下.效果图如下: 一.总体思路 1.静态部分的笑脸. 这一部分的笑脸就是一个半圆弧,加上两颗眼睛,这部分比较简单,用于一开始的展示. 2.动态笑脸的实现. 2.1.先是从底部有一个圆形在运动,运动在左眼位置时把左眼给绘制,同时圆形继续运动,运动到右眼位置时绘制右眼,圆形继续运动到最右边的位置. 2.2.当上面的圆形运动到最右边时候,开始不断绘制脸,从右向左,脸不断增长,这里脸设置为接近半个圆形的大小. 2.3.当脸画完的时候,开始让脸旋转