zoukankan      html  css  js  c++  java
  • android-自定义弹窗-仿58同城的分享弹窗

    引子

     不废话,直接上效果图;(录屏软件录不了点击效果,如果用我的代码去测试的话,直接点击中间那个按钮就行了)

    调用层的代码

    Activity中的代码:

     1 import android.os.Bundle;
     2 import android.os.Handler;
     3 import android.os.Looper;
     4 import android.support.annotation.Nullable;
     5 import android.view.View;
     6 import android.widget.TextView;
     7 
     8 import com.example.administrator.technologystackapp.R;
     9 import com.example.administrator.technologystackapp.activities.activity.manager.BaseActivity;
    10 import com.example.administrator.technologystackapp.activities.custom.dialog.SharePopDialog;
    11 
    12 /**
    13  * 自定义的弹窗
    14  */
    15 public class ActivityCustomDialog extends BaseActivity {
    16 
    17     private Handler handler = new Handler(Looper.getMainLooper());
    18 
    19     @Override
    20     protected void onCreate(@Nullable Bundle savedInstanceState) {
    21         super.onCreate(savedInstanceState);
    22         setContentView(R.layout.activity_custom_dialog);
    23         initView();
    24     }
    25 
    26     private TextView tv;
    27 
    28     private void initView() {
    29         tv = findViewById(R.id.tv);
    30         tv.setOnClickListener(new View.OnClickListener() {
    31             @Override
    32             public void onClick(View v) {
    33                 SharePopDialog popDialog = new SharePopDialog();
    34                 popDialog.showDialog(ActivityCustomDialog.this);
    35             }
    36         });
    37     }
    38 
    39 }

    activity的布局文件:

    <?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"
        android:gravity="center">
    
        <TextView
            android:id="@+id/tv"
            android:background="@drawable/active_button_background"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="自定义的dialog" />
    
    </LinearLayout>

    可以发现,调用非常简单。见上面的红色代码。

    弹窗工具类以及其他相关的代码

    SharePopDialog.java
      1 import android.animation.ValueAnimator;
      2 import android.app.Activity;
      3 import android.app.Dialog;
      4 import android.content.Context;
      5 import android.view.Gravity;
      6 import android.view.LayoutInflater;
      7 import android.view.View;
      8 import android.view.Window;
      9 import android.view.WindowManager;
     10 import android.view.animation.OvershootInterpolator;
     11 import android.widget.LinearLayout;
     12 import android.widget.RelativeLayout;
     13 
     14 import com.example.administrator.technologystackapp.R;
     15 
     16 public class SharePopDialog {
     17 
     18     public SharePopDialog() {
     19     }
     20 
     21     private Dialog dialog;// 利用android自带的dialog类
     22     private View dialogView;// 弹窗的内容view
     23     private RelativeLayout ll_up;// 弹窗内容的某部分
     24     private LinearLayout popListView;// 弹窗内容的某部分
     25 
     26     public void showDialog(Activity activity) {
     27         dialog = new Dialog(activity, R.style.dialog_loading_bar_no_frame);//创建一个dialog实例,
     28         dialogView = LayoutInflater.from(activity).inflate(R.layout.dialog_share_pop_v, null);//实例化一个view作为弹窗的内容view
     29         popListView = dialogView.findViewById(R.id.popListView);
     30         ll_up = dialogView.findViewById(R.id.ll_up);
     31 
     32         dialog.setContentView(dialogView);//设置弹窗的内容view
     33         dialog.setCanceledOnTouchOutside(true);//设置是否可以在窗口之外点击屏幕让弹窗消失
     34         dialog.setCancelable(true);//是否可以被按下back而让弹窗消失
     35         Window window = dialog.getWindow();//获得弹窗的 window对象
     36         if (window != null) {
     37             WindowManager.LayoutParams params = window.getAttributes();
     38             params.gravity = Gravity.BOTTOM;//初始化弹窗的位置,在底部
     39             params.width = getScreenPixelsWidth(activity);//弹窗的宽度是整个屏幕的宽度
     40             window.setWindowAnimations(R.style.popwindow_anim_style);// 弹窗的显示和消失,加入动画
     41         }
     42 
     43         dialog.show();//显示弹窗
     44 
     45         startAnimLayout();//上部分外层动画
     46         startAnim();// 上部分内层动画,每一个元素分开做动画
     47     }
     48 
     49     /**
     50      * 获取屏幕的宽度,单位是像素px
     51      * @param activity
     52      * @return
     53      */
     54     private int getScreenPixelsWidth(Context activity) {
     55         return activity.getResources().getDisplayMetrics().widthPixels;
     56     }
     57 
     58     private int animDuration = 500;// 动画执行的时长
     59 
     60     /**
     61      * 动画效果1
     62      */
     63     private void startAnimLayout() {
     64         //整体layout的动画,Y轴移动
     65         final int height = 20;
     66         final ValueAnimator anim = ValueAnimator.ofFloat(1, 0, 1);
     67         anim.setDuration(animDuration);
     68         anim.setInterpolator(new OvershootInterpolator());//先快后慢的插值器
     69         anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
     70             @Override
     71             public void onAnimationUpdate(ValueAnimator animation) {
     72                 float value = (float) animation.getAnimatedValue();
     73                 ll_up.setTranslationY((1 - value) * height);
     74             }
     75         });
     76         anim.start();
     77     }
     78 
     79     /**
     80      * 动画效果2
     81      */
     82     private void startAnim() {
     83         int count = popListView.getChildCount();
     84         long delay = 0;
     85 
     86         for (int i = 0; i < count; i++) {
     87             final View child = popListView.getChildAt(i);
     88             child.setTranslationY(1 * 600);
     89             child.setAlpha(1 - 1);
     90         }
     91 
     92         for (int i = 0; i < count; i++) {
     93             final View child = popListView.getChildAt(i);
     94 
     95             ValueAnimator anim = ValueAnimator.ofFloat(1, 0);
     96             anim.setDuration(animDuration);
     97             anim.setInterpolator(new OvershootInterpolator());
     98             anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
     99                 @Override
    100                 public void onAnimationUpdate(ValueAnimator animation) {
    101                     float value = (float) animation.getAnimatedValue();
    102                     child.setTranslationY(value * 600);
    103                     child.setAlpha(1 - value);
    104                 }
    105             });
    106             anim.setStartDelay(delay);
    107             anim.start();
    108             delay += 100;
    109         }
    110     }
    111 }

    弹窗的显示和消失的动画效果,将下面的代码加入到style.xml里面去

    <style name="popwindow_anim_style">
            <item name="android:windowEnterAnimation">@anim/slide_in_from_bottom</item>
            <!-- 指定显示的动画xml -->
            <item name="android:windowExitAnimation">@anim/slide_out_to_bottom</item>
            <!-- 指定消失的动画xml -->
        </style>

    弹窗的内容布局文件 dialog_share_pop_v.xml

      1 <?xml version="1.0" encoding="utf-8"?>
      2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
      3     android:layout_width="match_parent"
      4     android:layout_height="wrap_content"
      5     android:layout_alignParentBottom="true"
      6     android:gravity="center"
      7     android:orientation="vertical"
      8     android:paddingBottom="10dp"
      9     android:paddingLeft="20dp"
     10     android:paddingRight="20dp">
     11 
     12     <RelativeLayout
     13         android:id="@+id/ll_up"
     14         android:layout_width="match_parent"
     15         android:layout_height="150dp"
     16         android:layout_marginBottom="10dp"
     17         android:layout_marginTop="20dp"
     18         android:background="@drawable/dialog_background"
     19         android:gravity="center"
     20         android:orientation="vertical"
     21         android:paddingTop="10dp">
     22 
     23         <TextView
     24             android:id="@+id/tv_emp"
     25             android:layout_width="match_parent"
     26             android:layout_height="wrap_content"
     27             android:alpha="0.95"
     28             android:gravity="center"
     29             android:padding="5dp"
     30             android:text="      "
     31             android:textColor="#666666"
     32             android:textSize="18sp" />
     33 
     34         <LinearLayout
     35             android:id="@+id/popListView"
     36             android:layout_width="match_parent"
     37             android:layout_height="match_parent"
     38             android:layout_centerHorizontal="true"
     39             android:layout_marginBottom="20dp"
     40             android:layout_marginTop="10dp"
     41             android:gravity="bottom|left"
     42             android:orientation="horizontal">
     43 
     44             <LinearLayout
     45                 android:layout_width="0dp"
     46                 android:layout_height="wrap_content"
     47                 android:layout_marginLeft="0dp"
     48                 android:layout_weight="1"
     49                 android:gravity="center"
     50                 android:orientation="vertical">
     51 
     52                 <ImageView
     53                     android:layout_width="wrap_content"
     54                     android:layout_height="wrap_content"
     55                     android:background="@drawable/image_background2"
     56                     android:src="@mipmap/sns_pyquan_icon" />
     57 
     58                 <TextView
     59                     android:layout_width="wrap_content"
     60                     android:layout_height="wrap_content"
     61                     android:layout_marginTop="5dp"
     62                     android:text="微信朋友圈"
     63                     android:textSize="12dp" />
     64 
     65             </LinearLayout>
     66 
     67             <LinearLayout
     68                 android:layout_width="0dp"
     69                 android:layout_height="wrap_content"
     70                 android:layout_marginLeft="0dp"
     71                 android:layout_weight="1"
     72                 android:gravity="center"
     73                 android:orientation="vertical">
     74 
     75                 <ImageView
     76                     android:layout_width="wrap_content"
     77                     android:layout_height="wrap_content"
     78                     android:background="@drawable/image_background2"
     79                     android:src="@mipmap/sns_pyquan_icon" />
     80 
     81                 <TextView
     82                     android:layout_width="wrap_content"
     83                     android:layout_height="wrap_content"
     84                     android:layout_marginTop="5dp"
     85                     android:text="微信朋友圈"
     86                     android:textSize="12dp" />
     87 
     88             </LinearLayout>
     89 
     90             <LinearLayout
     91                 android:layout_width="0dp"
     92                 android:layout_height="wrap_content"
     93                 android:layout_marginLeft="0dp"
     94                 android:layout_weight="1"
     95                 android:gravity="center"
     96                 android:orientation="vertical">
     97 
     98                 <ImageView
     99                     android:layout_width="wrap_content"
    100                     android:layout_height="wrap_content"
    101                     android:background="@drawable/image_background2"
    102                     android:src="@mipmap/sns_pyquan_icon" />
    103 
    104                 <TextView
    105                     android:layout_width="wrap_content"
    106                     android:layout_height="wrap_content"
    107                     android:layout_marginTop="5dp"
    108                     android:text="微信朋友圈"
    109                     android:textSize="12dp" />
    110 
    111             </LinearLayout>
    112 
    113             <LinearLayout
    114                 android:layout_width="0dp"
    115                 android:layout_height="wrap_content"
    116                 android:layout_marginLeft="0dp"
    117                 android:layout_weight="1"
    118                 android:gravity="center"
    119                 android:orientation="vertical">
    120 
    121                 <ImageView
    122                     android:layout_width="wrap_content"
    123                     android:layout_height="wrap_content"
    124                     android:background="@drawable/image_background2"
    125                     android:src="@mipmap/sns_pyquan_icon" />
    126 
    127                 <TextView
    128                     android:layout_width="wrap_content"
    129                     android:layout_height="wrap_content"
    130                     android:layout_marginTop="5dp"
    131                     android:text="微信朋友圈"
    132                     android:textSize="12dp" />
    133 
    134             </LinearLayout>
    135         </LinearLayout>
    136 
    137     </RelativeLayout>
    138 
    139 
    140     <TextView
    141         android:id="@+id/share_title"
    142         android:layout_width="match_parent"
    143         android:layout_height="wrap_content"
    144         android:layout_alignTop="@id/ll_up"
    145         android:layout_marginTop="10dp"
    146         android:alpha="0.95"
    147         android:gravity="center"
    148         android:padding="5dp"
    149         android:text="分享"
    150         android:textColor="#666666"
    151         android:textSize="18sp" />
    152 
    153     <TextView
    154         android:id="@+id/btn_cancel"
    155         android:layout_width="match_parent"
    156         android:layout_height="wrap_content"
    157         android:layout_below="@id/ll_up"
    158         android:background="@drawable/dialog_background2"
    159         android:gravity="center"
    160         android:padding="15dp"
    161         android:text="取消"
    162         android:textColor="#666666"
    163         android:textSize="18sp" />
    164 
    165 </RelativeLayout>

    两个anim(放在anim目录中):

    slide_in_from_bottom.xml (dialog切入动画)

    <?xml version="1.0" encoding="utf-8"?>
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="200"
        android:fromYDelta="100%"
        android:toYDelta="0" />

    slide_out_to_bottom.xml (dialog切出动画)

    <?xml version="1.0" encoding="utf-8"?>
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="200"
        android:fromYDelta="0"
        android:toYDelta="100%" />

    主要代码都在这里了。程序思路,也在代码注释中写明。

    OK,先酱紫。

  • 相关阅读:
    转载 如何去掉超链接文字下的下划线
    Fedora 15安装 VirtualBox 4.1
    庆祝开通!
    Delphi直接读写XML修改版
    Perforce的资料一点也没查到
    AxWebBrowser的Navigate2方法写参数的偷懒方法
    腾讯2012实习生面试
    如何让div在IE6下自适应
    PhpStorm修改字体
    监听url
  • 原文地址:https://www.cnblogs.com/hankzhouAndroid/p/9199666.html
Copyright © 2011-2022 走看看