Android 向右滑动销毁(finish)Activity, 随着手势的滑动而滑动并跳转的效果(二)

Android startActivity finishActivity displayActivity流程详解 通过以上对startActivity、finishActivity和displayActivity方法的详细解释,我们可以更好地理解Activity之间的切换和关闭流程。displayActivity方法并非官方提供的API方法,而是为了说明Activity的显示流程而设置的名称。在调用startActivity方法之前,需要创建一个Intent对象,并设置要启动的Activity的类名或Action。调用当前Activity的startActivity方法,传入之前创建的Intent对象。 阅读详情

写这篇文章是因为看了:http://blog.youkuaiyun.com/jdsjlzx/article/details/21231217这篇文章,并下载了demo运行了下。

现对其做了一些修改:

(1) 不在通过setTouchView来处理事件,采用事件拦截机制

(2)加入了右侧滑动机制

(3)不在对整个activity的触摸都有效,采用了触摸点判断,使其只是左右边界时才有效,从而是activity的触摸事件和listview等控件的滚动相分开

(4)加入左右滑动切换机制的禁用与开启功能,使其更方便

 

本文只贴上部分代码,不做原理讲述,如果你没有看上一篇:Android 向右滑动销毁(finish)Activity, 随着手势的滑动而滑动的效果(一),请先看一遍。

demo中使用需要注意的地方,在代码中都有注释,有任何问题欢迎联系。

 

1、activity布局,根节点使用定义的view(只对需要滑动的布局加即可)

<?xml version="1.0" encoding="utf-8"?>
<com.example.view.SildingFinishLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/slidingLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal"
        android:background="#88ff90" >
        <Button
            android:id="@+id/button1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="单向滑动"
            />
       
    </LinearLayout>

</com.example.view.SildingFinishLayout>

2、SildingFinishLayout的实现

public class SildingFinishLayout extends RelativeLayout{
	private final String TAG = SildingFinishLayout.class.getName();
	
	/**
	 * SildingFinishLayout布局的父布局
	 */
	private ViewGroup mParentView;
	
	/**
	 * 滑动的最小距离
	 */
	private int mTouchSlop;
	/**
	 * 按下点的X坐标
	 */
	private int downX;
	/**
	 * 按下点的Y坐标
	 */
	private int downY;
	/**
	 * 临时存储X坐标
	 */
	private int tempX;
	/**
	 * 滑动类
	 */
	private Scroller mScroller;
	/**
	 * SildingFinishLayout的宽度
	 */
	private int viewWidth;
	/**
	 * 记录是否正在滑动
	 */
	private boolean isSilding;
	
	private OnSildingFinishListener onSildingFinishListener;
	
	private boolean enableLeftSildeEvent = true; //是否开启左侧切换事件
	private boolean enableRightSildeEvent = true; // 是否开启右侧切换事件
	private final int size = 20; //按下时范围(处于这个范围内就启用切换事件,目的是使当用户从左右边界点击时才响应)
	private boolean isIntercept = false; //是否拦截触摸事件
	private boolean canSwitch;//是否可切换
	private boolean isSwitchFromLeft = false; //左侧切换
	private boolean isSwitchFromRight = false; //右侧侧切换
	

	public SildingFinishLayout(Context context, AttributeSet attrs) {
		this(context, attrs, 0);
	}

	public SildingFinishLayout(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);

		mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
		Log.e(TAG, "设备的最小滑动距离:" + mTouchSlop);
		mScroller = new Scroller(context);
	}

	@Override
	protected void onLayout(boolean changed, int l, int t, int r, int b) {
		super.onLayout(changed, l, t, r, b);
		if (changed) {
			// 获取SildingFinishLayout所在布局的父布局
			mParentView = (ViewGroup) this.getParent();
			viewWidth = this.getWidth();
		}
		Log.e(TAG, "viewWidth=" + viewWidth);
	}
	
	
	public void setEnableLeftSildeEvent(boolean enableLeftSildeEvent) {
		this.enableLeftSildeEvent = enableLeftSildeEvent;
	}
	
	
	public void setEnableRightSildeEvent(boolean enableRightSildeEvent) {
		this.enableRightSildeEvent = enableRightSildeEvent;
	}
	

	/**
	 * 设置OnSildingFinishListener, 在onSildingFinish()方法中finish Activity
	 * 
	 * @param onSildingFinishListener
	 */
	public void setOnSildingFinishListener(
			OnSildingFinishListener onSildingFinishListener) {
		this.onSildingFinishListener = onSildingFinishListener;
	}
	
	//是否拦截事件,如果不拦截事件,对于有滚动的控件的界面将出现问题(相冲突)
	@Override
	public boolean onInterceptTouchEvent(MotionEvent ev) {
		float downX = ev.getRawX();
		Log.e(TAG, "downX =" + downX + ",viewWidth=" + viewWidth);
		if(enableLeftSildeEvent && downX < size){
			Log.e(TAG, "downX 在左侧范围内 ,拦截事件");
			isIntercept = true;
			isSwitchFromLeft = true;
			isSwitchFromRight = false;
			return true;
		}else if(enableRightSildeEvent && downX > (viewWidth - size)){
			Log.e(TAG, "downX 在右侧范围内 ,拦截事件");
			isIntercept = true;
			isSwitchFromRight = true;
			isSwitchFromLeft = false;
			return true;
		}else{
			Log.e(TAG, "downX 不在范围内 ,不拦截事件");
			isIntercept = false;
			isSwitchFromLeft = false;
			isSwitchFromRight = false;
		}
		return super.onInterceptTouchEvent(ev);
	}


	@Override
	public boolean onTouchEvent(MotionEvent event) {
		if(!isIntercept){//不拦截事件时 不处理
			return false;
		}
		switch (event.getAction()){
		case MotionEvent.ACTION_DOWN:
			downX = tempX = (int) event.getRawX();
			downY = (int) event.getRawY();
			break;
		case MotionEvent.ACTION_MOVE:
			int moveX = (int) event.getRawX();
			int deltaX = tempX - moveX;	
			tempX = moveX;
			if (Math.abs(moveX - downX) > mTouchSlop && Math.abs((int) event.getRawY() - downY) < mTouchSlop) {
				isSilding = true;
			}
			
			Log.e(TAG, "scroll deltaX=" + deltaX);			
			if(enableLeftSildeEvent){//左侧滑动
				if (moveX - downX >= 0 && isSilding) {
					mParentView.scrollBy(deltaX, 0);
				}
			}
			
			if(enableRightSildeEvent){//右侧滑动
				if (moveX - downX <= 0 && isSilding) {
					mParentView.scrollBy(deltaX, 0);
				}
			}
			
			Log.e(TAG + "/onTouchEvent", "mParentView.getScrollX()=" + mParentView.getScrollX());
			break;
		case MotionEvent.ACTION_UP:
			isSilding = false;
			//mParentView.getScrollX() <= -viewWidth / 2  ==>指左侧滑动
			//mParentView.getScrollX() >= viewWidth / 2   ==>指右侧滑动
			if (mParentView.getScrollX() <= -viewWidth / 2 || mParentView.getScrollX() >= viewWidth / 2) {
				canSwitch = true;
				if(isSwitchFromLeft){
					scrollToRight();
				}
				
				if(isSwitchFromRight){
					scrollToLeft();
				}
			} else {
				scrollOrigin();
				canSwitch = false;
			}
			break;
		}
		return true;
	}
	
	
	/**
	 * 滚动出界面至右侧
	 */
	private void scrollToRight() {
		final int delta = (viewWidth + mParentView.getScrollX());
		// 调用startScroll方法来设置一些滚动的参数,我们在computeScroll()方法中调用scrollTo来滚动item
		mScroller.startScroll(mParentView.getScrollX(), 0, -delta + 1, 0, Math.abs(delta));
		postInvalidate();
	}
	
	/**
	 * 滚动出界面至左侧
	 */
	private void scrollToLeft() {
		final int delta = (viewWidth - mParentView.getScrollX());
		// 调用startScroll方法来设置一些滚动的参数,我们在computeScroll()方法中调用scrollTo来滚动item
		mScroller.startScroll(mParentView.getScrollX(), 0, delta - 1, 0, Math.abs(delta));//此处就不可用+1,也不卡直接用delta
		postInvalidate();
	}

	/**
	 * 滚动到起始位置
	 */
	private void scrollOrigin() {
		int delta = mParentView.getScrollX();
		mScroller.startScroll(mParentView.getScrollX(), 0, -delta, 0,
				Math.abs(delta));
		postInvalidate();
	}
	
	

	@Override
	public void computeScroll(){
		// 调用startScroll的时候scroller.computeScrollOffset()返回true,
		if (mScroller.computeScrollOffset()) {
			mParentView.scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
			postInvalidate();

			if (mScroller.isFinished()) {
				if (onSildingFinishListener != null && canSwitch) {
					Log.e(TAG, "mScroller finish");
					if(isSwitchFromLeft){//回调,左侧切换事件
						onSildingFinishListener.onSildingBack();
					}
					
					if(isSwitchFromRight){//右侧切换事件
						onSildingFinishListener.onSildingForward();
					}
				}
			}
		}
	}
	

	public interface OnSildingFinishListener {
		public void onSildingBack();
		public void onSildingForward();
	}

}


3、BaseActivity

/**
 * 1. 必须设置透明风格,设置透明后需对Activity设置一个背景色,其遮盖效果
 * 2. 要调用initBaseActivity(boolean enableLeftSilde, boolean enableRigftSilde)
 * 
 * @ enableLeftSilde : 开启左侧
 * @ enableRightSilde : 开启右侧
 * 
 * */
public class BaseActivity extends Activity implements OnSildingFinishListener{
	private SildingFinishLayout sildingLayout;
	
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
	}
	
	/**
	 * @enableLeftSilde : 开启左侧
 	 * @enableRightSilde : 开启右侧
 	 * */
	public void initBaseActivity(boolean enableLeftSilde, boolean enableRigftSilde){
		sildingLayout = (SildingFinishLayout) findViewById(R.id.slidingLayout);
		sildingLayout.setOnSildingFinishListener(this);
		sildingLayout.setEnableLeftSildeEvent(enableLeftSilde);
		sildingLayout.setEnableRightSildeEvent(enableRigftSilde);
	}


	@Override
	public void onSildingBack() {
		Toast.makeText(getApplicationContext(), "back", Toast.LENGTH_SHORT).show();
		finish();
	}


	@Override
	public void onSildingForward() {
		Toast.makeText(getApplicationContext(), "前进", Toast.LENGTH_SHORT).show();
		finish();
	}
}

 

欢迎有需要的朋友下载,0积分,有问题相互交流。

下载地址:  Activity滑动跳转

在虚拟机中对阿克曼转向车进行导航及避障的仿真测试 一、    在我使用rosdep install teb_local_planner去安装teb_local_planner的时候,报错:Command ‘rosdep’ not found, but can be installed with:sudo apt install python3-rosdep2    我花大半个月好不容易建立起的一系列ROS环境,被python3-rosdep2这条万恶的语句连同ROS一起给我删了。。。悲伤来的那么猝不及防    随着ROS版本的迭代,相关资料很多都不再适用 阅读详情

相关推荐

AI量化投资开源平台——Qlib(微矿)的学习使用笔记(随缘更新)

Qlib 涵盖了量化投资的全过程,为用户的 AI 算法提供了高性能的底层基础架构,从框架设计上让用户可以更容易地应用 AI 算法来辅助解决量化投资的各个关键问题(例如 Alpha 预测,风险预测,市场动态性建模)。本文旨在记录一些面向初学者的基础内容。

in_void的博客 3133

Android 向右滑动销毁(finish)Activity, 随着手势的滑动而滑动的效果

转载自xiaanming的博客(http://blog.youkuaiyun.com/xiaanming/article/details/20934541) 今天给大家带来一个向右滑动销毁Activity的效果,Activtiy随着手指的移动而移动,该效果在Android应用中还是比较少见的,在IOS中就比较常见了,例如“网易新闻” ,"美食杰" , "淘宝"等应用采用此效果,而Android应用中“知

blog of Jeremy 847

人形机器人五大核心零部件技术解析与国产化实况

人形机器人并非简单机械集成,而是物理、能量、感知、决策与执行五层系统毫秒级协同的复杂体。其性能瓶颈往往不在于整机算法,而深植于谐波减速器的刚度稳定性、无框力矩电机的功率密度与温升控制、六维力传感器的动态响应与温漂抑制、运动控制器的实时OS生态及灵巧手的多指协同精度等底层硬件能力。这些部件共同构成整机68.3%的成本,且国产化率差异显著——谐波减速器达72%,而高精度力矩传感器仍受制于日德厂商。本文聚焦‘谐波减速器’和‘六维力传感器’两大热词,从材料工艺、参数定义、失效模式到产线验证,揭示真正卡脖子的技术关卡

weixin_29065959的博客 407

Android 向左向右滑动销毁(finish)Activity, 随着手势的滑动而滑动的效果

最近在学习手势操作的时候看到了这篇文章  Android 向右滑动销毁(finish)Activity, 随着手势的滑动而滑动的效果 博客地址 :http://blog.youkuaiyun.com/xiaanming/article/details/20934541 里面讲的真心不错,对于我这样的菜鸟帮助很大。 这篇博客的主要思想是: 1.从左往右滑动屏幕时,如果滑动距离超过屏幕宽度的一半,就fin

大啊大前端 2170

版图学习汇总十一(DRC、LVS注意事项)

esd。

weixin_56071389的博客 2262

【比较器仿真】

比较器tran noise、pnoise仿真、噪声仿真、MC失调仿真

pickweb的博客 1万+

android home 销毁 activity,android 触发home之后activity销毁问题

在使用Notification通知栏的时候模拟home键返回桌面,在未重写onSaveInstanceState方法的情况下,activity会被销毁掉,当点通知栏跳回activity会报错。网上看过不少文章都是说需要重写onSaveInstanceState,也有一些列子但是试过activity还是销毁掉了,后来看了查看后台出现java.lang.ClassCastException: java...

weixin_28769989的博客 839

【WiFi软件开发】IOCTL和Netlink----用户空间和内核空间交互的两种方式

linux开发中通常会涉及用户空间和内核模块的交互。本文介绍了两种典型的用户空间和内核模块通信方式:ioctl和netlink

liuwe1ye的博客 2349

Android之Activity滑动关闭(销毁)

效果: 通过滑动界面关闭当前Activity。 本效果实现主要是通过开源控件SwipeBackLayout 代码:http://download.youkuaiyun.com/detail/u010932039/8402903

Lj2115的Android专栏 570

从零构建知识图谱:本体工程与知识建模实战指南

本文是一份从零构建知识图谱的实战指南,重点阐述了知识建模与本体工程的核心地位。文章详细介绍了如何使用Protégé工具进行本体设计,包括定义领域、复用现有本体、构建类层次与属性约束,并讲解了如何利用D2RQ工具将关系数据库数据转换为RDF三元组,最终通过Apache Jena Fuseki搭建SPARQL端点进行知识查询与推理,让知识图谱真正“活”起来。

weixin_29057695的博客 572

翁恺-C语言程序设计 PTA习题集

代码练习题

qq_46085472的博客 7646

手势滑动结束 Activity(一)基本功能的实现

喜欢听音乐的朋友可能都看过天天动听这款 app, 这款 app 有一个亮点就是在切换页面(Fragment)的时候可以通过手势滑动来结束当前页面,这里先说一下,我为什么会这么关心这个功能呢,因为前两天 PM说我们即将开始做的这款app 也要实现页面能通过手势滑动来结束的功能,所以我就拿着这款 app 滑了一上午;但是我要实现的跟天天动听这款 app又有点不同,细心观察的朋友可能会发现,天天动听是

lizubing1992的专栏 565

Windows配置L2TP/IPsec连接

Windows 系统的 L2TP/IPsec 功能,通过配置即可构建加密 VPN 通道。

m0_61806534的博客 1668

Android 随手势滑动销毁(finish)Activity

源码片段public class MainActivity extends Activity {     private Button mButton;    private GestureDetector mGestureDetector;      @Override    protected void onCreate(Bundle savedInstanceState) {       

Top丶富 的博客 501

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Android 向右滑动销毁(finish)Activity 随着手势的滑动而滑动的效果

Android 向右滑动销毁(finish)Activity 随着手势的滑动而滑动的效果

qq_44943613的博客 351

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

android activity滑动切换,Android 向右滑动切换Activity, 随着手势的滑动而滑动的效果...

【实例简介】Android 向右滑动切换Activity, 随着手势的滑动而滑动的效果,项目详情http://blog.youkuaiyun.com/xiaanming/article/details/20934541【实例截图】【核心代码】SlidingFinish└── SlidingFinish├── AndroidManifest.xml├── bin│ ├── AndroidManifest.x...

weixin_42500279的博客 296

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Slidr使用详解,Android手指滑动返回Activity

概述我们都知道IOS系统自带手指滑动可以返回当前界面,现在我们使用Slidr可以很简单的实现这些功能,而且可以做一些个性化得定制.Slidr使用 GitHub地址 ReadMe 1 首先清单文件配置我们将要滑动Activity的theme,或者在我们的Application节点下全局配置theme,在theme里面添加 <!--切换activity时屏幕不变暗-->

Andy_l1的博客 4438

<Android> 在Activity之间进行滑动效果的切换Anim动画

在Activity之间切换,默认切换的效果是t

大海小鱼的专栏 1274

考拉Android全局滑动返回及联动效果的实现

} if (mTranslucentState == INIT) { convertActivityToTranslucent(activity, null); } else if (mTranslucentState == CHANGE_STATE_FAIL) { return false; } try { Method method = Activity.class.getDeclaredMethod(“convertFromTranslucent”); method.setAccessible(tru

m0_69789996的博客 989

android仿微信的activity平滑水平切换动画,Android实现平滑翻动效果

本文实例为大家分享了Android实现平滑翻动效果的具体代码,供大家参考,具体内容如下效果1.activity加implementsimplements GestureDetector.OnGestureListener2.android:id="@+id/mars_bg"android:layout_width="match_parent"android:layout_height="match...

weixin_35541322的博客 293

android 左滑跳转_左右滑动跳转Activity(在滑动过程动态改变视图变化)

1 packagecom.bwf.dragview;23 importcom.nineoldandroids.view.ViewHelper;45 importandroid.app.Activity;6 importandroid.content.Context;7 importandroid.os.Build;8 importandroid.support.v4.view.GestureDet...

weixin_42517649的博客 564

android手势操作滑动效果触摸屏事件处理

android手势操作滑动效果触摸屏事件处理

正在Android的学习路上 338

android 横向滑动事件,Android中Activity中左右滑动手势的监听

/** 完成对左右划屏*/@Overridepublic boolean onTouchEvent(MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:prev.set(event.getX(), event.getY());break;case MotionEvent.ACTION_UP:bre...

weixin_31099497的博客 290

Android中finish掉其它的Activity

博客地址:http://www.cnblogs.com/colinliu/ 在Android开发时,一般情况下我们如果需要关掉当前Activity非常容易,只需要一行代码 this.finish;即可。 那么,如果是想要在当前Activity中关掉其它的Activity应该怎么实现呢? 比如更改了某个设定,程序需要重新运行并加载新的配置文件,就要用到restart或finish让

Tuke0814的博客 2196

【Activity】基于Android9.0的Activity的finish流程分析

目录 1. IActivityController.aidl 1.1 接口中的方法说明 1.2 应用如何使用IActivityController 1.2.1 自行类实现IActivityController.Stub 1.2.2 获取IActivityManager代理对象并调用setActivityController 2. finish流程 本文章意在分析Activity的fi...

明朗晨光的专栏 3971

Android13 Activity finish流程分析

ActivityThread的handleSendResult方法用于处理Activity的结果。当一个Activity执行完毕并返回结果时,ActivityThread会调用handleSendResult方法来处理这个结果。handleSendResult方法会根据结果的类型进行相应的处理,例如更新UI界面或者执行其他操作。

liuning1985622的博客 1569
上一篇: Android 向右滑动销毁(finish)Activity, 随着手势的滑动而滑动的效果(一)
下一篇: 自定义环形进度条
安卓鸟
博客等级 码龄15年 14粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值