Android --- 简单实现向右滑动关闭activity

  最近看到UC浏览器上的向右滑动删除activity,觉得这个退出动画挺酷的,自己在网上找了点资料,简单实现了一波。废话不多说,直接看代码。

  这个是核心的代码:子类继承这个activity就可以了。

  1 package com.itljw.slidingfinishactivity;
  2
  3 import android.app.Activity;
  4 import android.content.Context;
  5 import android.content.Intent;
  6 import android.graphics.Canvas;
  7 import android.graphics.drawable.Drawable;
  8 import android.os.Bundle;
  9 import android.util.AttributeSet;
 10 import android.view.MotionEvent;
 11 import android.view.View;
 12 import android.widget.RelativeLayout;
 13 import android.widget.Scroller;
 14
 15 public abstract class BaseSlidingActivity extends Activity {
 16
 17     private GroupView slideGroupView; // 包裹布局的View
 18     private View slideLayoutView; // 布局
 19     private Scroller mScroller; // 滑动类
 20     private Drawable mShadowDrawable; // 阴影
 21
 22
 23     @Override
 24     protected void onCreate(Bundle savedInstanceState) {
 25         super.onCreate(savedInstanceState);
 26
 27         initView(); // 初始化
 28
 29         setContentView(setView()); // 设置布局
 30
 31     }
 32
 33     /**
 34      * 初始化
 35      */
 36     private void initView() {
 37         slideGroupView = new GroupView(this);
 38         mScroller = new Scroller(this);
 39         mShadowDrawable = getResources().getDrawable(R.drawable.shape_left);
 40     }
 41
 42     /**
 43      * 设置布局
 44      * @return
 45      */
 46     private View setView() {
 47
 48         slideLayoutView = View.inflate(this, getLayoutID(), null);
 49
 50         // 设置参数信息
 51         RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT,
 52                 RelativeLayout.LayoutParams.MATCH_PARENT);
 53
 54         slideLayoutView.setLayoutParams(params);
 55         slideGroupView.setLayoutParams(params);
 56
 57         slideGroupView.addView(slideLayoutView); // 将布局添加进GroupView
 58         return slideGroupView; // 返回GroupView
 59     }
 60
 61     @Override
 62     public void startActivity(Intent intent) {
 63         super.startActivity(intent);
 64         overridePendingTransition(R.anim.base_slide_right_in, R.anim.base_slide_remain);
 65     }
 66
 67
 68     @Override
 69     public void onBackPressed() {
 70         super.onBackPressed();
 71         overridePendingTransition(0, R.anim.base_slide_right_out);
 72     }
 73
 74     @Override
 75     public void finish() {
 76         // TODO Auto-generated method stub
 77         super.finish();
 78         overridePendingTransition(R.anim.keep, R.anim.keep);
 79     }
 80
 81
 82     /**
 83      * 包裹布局的View
 84      */
 85     private class GroupView extends RelativeLayout {
 86
 87         private int screenWidth; // 屏幕宽度
 88         private int startX = -1; // 按下的点
 89         private int lastX; // 移动点
 90         private int tempX; // 临时记录点的位置
 91         private int minDistance = 10; // 最小距离
 92         private int duration = 500; // 时间
 93         private boolean isFinish; // 是否结束
 94
 95         public GroupView(Context context) {
 96             this(context, null);
 97         }
 98
 99         public GroupView(Context context, AttributeSet attrs) {
100             this(context, attrs, 0);
101             // TODO Auto-generated constructor stub
102         }
103
104         public GroupView(Context context, AttributeSet attrs, int defStyleAttr) {
105             super(context, attrs, defStyleAttr);
106
107             System.out.println("init");
108         }
109
110         @Override
111         protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
112
113             // 画阴影
114             mShadowDrawable.setBounds(getLeft() - 10,0,getLeft(),getHeight());
115             mShadowDrawable.draw(canvas);
116
117             return super.drawChild(canvas, child, drawingTime);
118         }
119
120         /**
121          * 触摸事件的处理
122          * @param event
123          * @return
124          */
125         @Override
126         public boolean onTouchEvent(MotionEvent event) {
127
128             switch (event.getAction()){
129                 case MotionEvent.ACTION_DOWN: // 当手指按下的时候调用此方法
130
131                     startX = tempX = (int) event.getRawX();
132
133                     break;
134
135                 case MotionEvent.ACTION_MOVE: // 当手指移动的时候调用此方法
136
137                     if(startX == -1){ // 避免没有响应到down事件的情况
138                         startX = (int) event.getRawX();
139                     }
140
141                     lastX = (int) event.getRawX();
142
143                     int deltax = tempX - lastX; // x轴方向上的偏移量
144
145                     if(lastX - startX > minDistance){ // 当偏移量大于最小移动距离  向右滑动
146                         this.scrollBy(deltax,0);
147                     }
148
149                     tempX = lastX;
150
151                     break;
152
153                 case MotionEvent.ACTION_UP:
154
155                     // 判断当前移动的位置是否超过屏幕的一半
156                     if(this.getScrollX() <= -screenWidth / 2){
157                         // 超过屏幕的一半 滑动到右边
158
159                         mScroller.startScroll(this.getScrollX(),0,-(screenWidth + this.getScrollX()),0,duration);
160                         postInvalidate(); // 刷新
161
162                         isFinish = true;
163
164                     }else{
165                         // 回弹
166                         mScroller.startScroll(this.getScrollX(),0,-this.getScrollX(),0,duration);
167                         postInvalidate(); // 刷新
168
169                         isFinish = false;
170                     }
171
172                     break;
173
174             }
175
176
177             return true;
178         }
179
180         @Override
181         public void computeScroll() {
182
183             if(mScroller.computeScrollOffset()){
184                 // 滑动还没有结束
185                 int currX = mScroller.getCurrX();
186                 int currY = mScroller.getCurrY();
187                 this.scrollTo(currX,currY); // 滑动
188
189                 postInvalidate();
190
191                 // 滑动结束
192                 if(mScroller.isFinished() && isFinish){
193                     finish();
194                 }
195
196
197             }
198
199
200         }
201
202         @Override
203         protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
204             super.onMeasure(widthMeasureSpec, heightMeasureSpec);
205
206             screenWidth = this.getMeasuredWidth(); // 获取屏幕的宽度
207
208         }
209     }
210
211     /**
212      * 获取布局id
213      *
214      * @return
215      */
216     public abstract int getLayoutID();
217
218 }

  这个Activity中首先是让子类去实现getLayoutID(),返回布局id,然后用一个自定义的GroupView来包裹布局,这么做的目的是因为ScrollBy(),scrollTo()这几个函数主要作用的是View里面的内容,然后主要处理的是OnTouchEvent事件,记录按下的点和移动的点,通过scrollBy对View进行拖动,在Action_UP事件中,判断当前的位置,根据当前的位置来确定是向右滑动finish掉界面还是回弹界面。

  阴影shape:

1 <?xml version="1.0" encoding="utf-8"?>
2 <shape xmlns:android="http://schemas.android.com/apk/res/android">
3
4     <gradient
5         android:endColor="#55000000"
6         android:startColor="#00000000"
7         android:centerColor="#11000000"/>
8 </shape>

  注意:activity的主题要设置为android:theme="@android:style/Theme.Translucent.NoTitleBar"

    

时间: 2024-10-26 13:07:55

Android --- 简单实现向右滑动关闭activity的相关文章

Android 向右滑动关闭页面

前言: 用最简单的例子来说明此问题. 1.在Activity中加上默认的布局Layout 2.在自定义的Layout中实现右滑关闭Activity的逻辑 直接上代码! 自定义的布局HFFinishRelativeLayout! package com.huofar.widget; import android.content.Context; import android.content.res.TypedArray; import android.support.v4.app.Fragment

【Android】12.2 利用Intent启动和关闭Activity

分类:C#.Android.VS2015: 创建日期:2016-02-23 一.简介 Android应用程序中一般都有多个Activity,在Activity中,通过调用StartActivity方法,并在该方法的参数中传递Intent对象,就可以实现不同Activity之间的切换和数据传递. 通过StartActivity方法传递intent对象来启动另一个Activity时,可分为两类: l 显式启动:在创建的Intent对象中明确指定启动的是哪个Activity: l 隐式启动:安卓系统根

Android中滑动关闭Activity

继承SwipeBackActivity即可实现向右滑动删除Activity效果 点击下载所需文件

Android总结篇系列:Activity Intent Flags及Task相关属性

同上文一样,本文主要引用自网上现有博文,并加上一些自己的理解,在此感谢原作者. 原文地址: http://blog.csdn.net/liuhe688/article/details/6761337 -------------------------------------------------------------------------- 今天我们来讲一下Activity的task相关内容. 上次我们讲到Activity的四种启动模式的时候,已经了解到一些关于task的技术,今天我再向大

【转载】Android开发中巧用Activity和Fragment

1.Activity的生命周期 1)多个Activity组成Activity栈,当前活动位于栈顶.我们先来看看各种Activity基类的类图: 当Activity类定义出来之后,这个Activity何时被实例化.它所包含的方法何时被调用,这些都不是由开发者所决定的,都应该由Android系统来决定. 下面我们来看一下Activity的生命周期: 2.Activity的用法 1)启动.关闭Activity // 首先需要创建启动的Activity对应的Intent Intent intent =

Android基础学习第二篇—Activity

写在前面的话: 1. 最近在自学Android,也是边看书边写一些Demo,由于知识点越来越多,脑子越来越记不清楚,所以打算写成读书笔记,供以后查看,也算是把自己学到所理解的东西写出来,献丑,如有不对的地方,希望大家给与指正. 2. 由于类似于读书笔记,可能格式神马的会比较随(hen)意(chou),大家看着受不了,可以使劲吐槽. *************************************我只是分割线***************************************

Android简单例子——AlertDialog

最近学习了一段时间的Android,在网上找了些小的Demo,自己模拟这做了下,首先谢谢那些提供例子的朋友 今天主要学习的是简单的Dialog的使用(实现退出对话框)和自定义对话框 1.实现退出对话框 普通模式的对话框使用比较简单,主要是设置对话框标题.设置对话框内容.设置对话框中的按钮,以及增加监听事件,主要代码如下 //普通样式的对话框 btn2 = (Button) findViewById(R.id.btn2); btn2.setOnClickListener(new OnClickLi

Android简单的编写一个txt阅读器(没有处理字符编码),适用于新手学习

本程序只是使用了一些基本的知识点编写了一个比较简单粗陋的txt文本阅读器,效率不高,只适合新手练习.所以大神勿喷. 其实想到编写这种程序源自本人之前喜欢看小说,而很多小说更新太慢,所以本人就只能找一个完本的.txt小说下载下来,有没有网络都可以看,当然现在不看那玩意了. 废话就不说了,程序中使用到的有4个类,5个xml文件,其中3个布局文件.String.xml.AndroidManifest.xml. 先看效果图吧(虽然很丑):     下面就上代码吧,本人都注释好了,由于本人技术还不行,注释

Android学习路径——Android的四个组成部分activity(一)

一.什么是Activity? Activity简单的说就是一个接口.我们是Android手机上看到的每个界面就是一个activity. 二.Activity的创建 1.定义一个类继承activity,然后在清单文件manifest.xml文件的application节点下注冊activity.这个activity就创建成功了. public class MyActivity extends Activity { } 2.清单文件注冊activity <application android:al