`
kingbinchow
  • 浏览: 124763 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

仿iOS 的AssistiveTouch 按键 Floating Action Button

 
阅读更多

FloatButton fb = new FloatButton(this);
		fb.show();
		fb.setClickActionListener(new ClickActionListener(){

			@Override
			public void onClickAction() {
				
			}});



import android.content.Context;
import android.graphics.drawable.Drawable;
import android.util.Log;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.ViewConfiguration;
import android.view.WindowManager;
import android.widget.ImageView;

import com.pingan.haoche.app.R;
/**
 *
 * float button in window
 * <p>
 * Need implement ClickActionListener for response click event
 *  <p>
 *  @author Kingz 2015-4-14
 *
 */
public class FloatButton implements OnTouchListener {
	
	private Context mContext;
	private ImageView mFloatContent;
	private boolean mIsShowing;
	private int mImageWidth;
	private int mImageHeight;
	private WindowManager mWindowManager;
	private WindowManager.LayoutParams mWinManagerParams;
	private int touchSlop;
	private ClickActionListener clickActionListener;

	public FloatButton(Context context) {
		mContext = context;
		mWindowManager = (WindowManager) context
				.getSystemService(Context.WINDOW_SERVICE);
		touchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
		creatFloatView();
		createParams();
	}


	private void creatFloatView() {
		mFloatContent = new ImageView(mContext);
		Drawable fudr = mContext.getResources().getDrawable(
				R.drawable.floatbutton);
		mImageWidth = (int) (fudr.getIntrinsicWidth());
		mImageHeight = (int) (fudr.getIntrinsicHeight());
		mFloatContent.setImageDrawable(fudr);
		mFloatContent.setVisibility(View.INVISIBLE);
		mFloatContent.setOnTouchListener(this);
		mFloatContent.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				clickActionListener.onClickAction();
			}

		});
	}
	private void createParams() {
		int dY = 10;
		mWinManagerParams = new WindowManager.LayoutParams();
		mWinManagerParams.type = WindowManager.LayoutParams.TYPE_APPLICATION;
		mWinManagerParams.format = android.graphics.PixelFormat.TRANSPARENT;
		mWinManagerParams.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
		mWinManagerParams.flags |= WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH;
		mWinManagerParams.gravity = Gravity.LEFT | Gravity.BOTTOM;
		mWinManagerParams.x = mDisWid - dY - mImageWidth;
		mWinManagerParams.y = dY + mImageHeight;
		mWinManagerParams.width = 75;
		mWinManagerParams.height = 75;
	}

	private float mTouchStartX;
	private float mTouchStartY;
	private float x;
	private float y;
	private boolean hasMoved = false;
	private int lasteventX = 0;
	private int lasteventY = 0;
	private int mContainerHeight = 0;
	private int mDisWid;

	@Override
	public boolean onTouch(View v, MotionEvent event) {
		x = event.getRawX();
		y = event.getRawY();

		switch (event.getAction()) {
		case MotionEvent.ACTION_DOWN: {

			hasMoved = false;
			mTouchStartX = event.getX();
			mTouchStartY = event.getY();
			lasteventX = (int) (x - mTouchStartX);
			lasteventY = (int) (y - mTouchStartY);
			mContainerHeight = lasteventY + mWinManagerParams.y;

			break;
		}
		case MotionEvent.ACTION_MOVE: {
			updateViewPosition();
			break;
		}
		case MotionEvent.ACTION_UP: {
			mTouchStartX = mTouchStartY = 0;
			if (hasMoved) {
				return true;
			}
			break;
		}
		}
		return false;
	}

	private void updateViewPosition() {
		int touchX = (int) (x - mTouchStartX);
		int touchY = (int) (y - mTouchStartY);

		int step = touchSlop;
		if (hasMoved || Math.abs(lasteventX - touchX) > step
				|| Math.abs(lasteventY - touchY) > step) {
			mWinManagerParams.x = touchX;
			mWinManagerParams.y = mContainerHeight - touchY;
			mWindowManager.updateViewLayout(mFloatContent, mWinManagerParams);

			hasMoved = true;
			lasteventX = touchX;
			lasteventY = touchY;
		}
	}

	public void show() {
		if (mIsShowing) {
			return;
		}
		mFloatContent.setVisibility(View.VISIBLE);
		if (mWindowManager != null && !mIsShowing) {
			mWindowManager.addView(mFloatContent, mWinManagerParams);
			mIsShowing = true;
		}

	}
	
	public interface ClickActionListener{
		void onClickAction();
	}
	public void setClickActionListener(ClickActionListener listener){
		clickActionListener = listener;
	}

}



  • 大小: 14.3 KB
  • 大小: 13.6 KB
分享到:
评论

相关推荐

    AssistiveTouch,仿IOS AssistiveTouch实现

    通过以上步骤,我们可以成功地在 Android 设备上实现一个仿 iOS 的 AssistiveTouch 功能。这一功能不仅可以方便用户快速访问常用操作,还可以根据个人需求进行定制,大大提升了手机的可操作性和个性化程度。在实际...

    android 可拖拽按钮 类似iOS assistive touch可全屏拖拽

    在Android开发中,实现一个类似iOS的Assistive Touch功能是一项常见的需求,它提供了一个浮动按钮,用户可以随时随地拖动并访问常用的功能。这个“android 可拖拽按钮 类似iOS assistive touch可全屏拖拽”的项目...

    仿苹果悬浮Assistive Touch按键

    【标题】"仿苹果悬浮Assistive Touch按键"是一个针对Android平台的应用开发示例,它模仿了苹果iOS系统中的Assistive Touch功能。在iOS中,Assistive Touch是一个内置的辅助工具,允许用户通过屏幕上的浮动按钮快速...

    ios-AssistiveTouch简仿.zip

    【iOS AssistiveTouch简仿】是一个关于iOS应用开发的话题,主要关注的是如何在自定义的用户界面中实现类似苹果设备上的AssistiveTouch功能。AssistiveTouch是iOS系统内置的一项辅助功能,它提供了一个浮动的虚拟按钮...

    android仿assistivetouch悬浮窗(带功能实现)

    总的来说,创建一个仿 AssistiveTouch 的悬浮窗涉及到了Android的权限管理、窗口管理、自定义View以及事件处理等多个核心知识点。通过实践和学习这些概念,开发者可以构建出更加高效、便捷的用户体验。

    仿AssistiveTouch,修改转发android

    【标题】"仿AssistiveTouch,修改转发android" 是一个关于在Android平台上创建类似苹果设备上的AssistiveTouch功能的开发项目。AssistiveTouch是iOS系统中的一个辅助工具,提供快速访问常用功能和手势操作的浮动按钮...

    ios中类似assistiveTouch的悬浮窗

    在iOS开发中,"ios中类似assistiveTouch的悬浮窗"是一种常见的用户界面特性,它模仿了Apple设备上的AssistiveTouch功能。AssistiveTouch是iOS系统自带的一项辅助功能,提供了一个浮动的小按钮,用户可以自定义快捷...

    iOS类似assistiveTouch悬浮小图标支持扩展和收缩

    在iOS开发中,为了提供用户更便捷的操作体验,开发者经常会在应用中实现类似Assistive Touch的悬浮小图标功能。这个“iOS类似assistiveTouch悬浮小图标支持扩展和收缩”的项目,就是一个很好的示例,它允许用户点击...

    类似于苹果AssistiveTouch.zip

    AssistiveTouch是苹果iOS系统中的一个辅助功能,它提供了一个浮动菜单,用户可以通过这个菜单快速访问各种设置和功能,如控制中心、设备锁定、屏幕截图等。 描述中提到,“太多无法一一验证是否可用”,这可能意味...

    ios-AssistiveTouch效果-跟随手指移动的悬浮button.zip

    通过以上知识点的运用,我们可以创建一个类似于iOS AssistiveTouch的悬浮button,它能跟随手指移动,提供便捷的用户交互。这样的功能不仅提高了应用的可用性,也为用户提供了个性化的体验。在实际开发中,可以进一步...

    苹果最新Assistive Touch SDK

    一行代码快速集成Assistive Touch功能: [HMYAssistiveControl createOnMainWindowWithCollapsedView:view andExpandedView:nil andBlockClickData:^(CGPoint pointTouch){ NSLog(@"click me is block!~ ha ha ha,...

    安卓 仿AssistiveTouch 窗口浮动按钮

    在安卓平台上,"仿AssistiveTouch 窗口浮动按钮"是一种常见的用户界面功能,类似于苹果iOS系统中的AssistiveTouch。这个功能为用户提供了一个便捷的入口,通过一个小巧的浮动按钮,用户可以快速访问各种常用操作或者...

    XFAssistiveTouch, 辅助按钮模拟iOS系统 AssistiveTouch.zip

    XFAssistiveTouch, 辅助按钮模拟iOS系统 AssistiveTouch 正在启动阅读此自述文件文档或相关博客了解 XFAssistiveTouch参考使用章节或示例代码在你的项目中使用 XFAssistiveTouch通信安装pod 'XFA

    Android-AssistiveTouch-配合Android手机沉浸式隐藏虚拟按键后快捷操作

    "Android-AssistiveTouch"是一个开源项目,旨在帮助用户在Android设备上实现类似iOS中的"小白点"功能,提供一种便捷的触摸操作方式。该项目特别适用于那些已经开启沉浸式模式并隐藏了虚拟按键的Android手机,如Nexus...

    android 类似Iphone AssistiveTouch的手势代码

    1. **浮动视图(Floating View)**:这是实现AssistiveTouch的基础,需要创建一个可以自由移动并始终显示在屏幕上的小窗口。这通常通过自定义View或者使用系统提供的`PopupWindow`或`SystemBarTintManager`来实现。...

    ios类似AssistiveTouch的全局浮动按钮

    在iOS开发中,"ios类似AssistiveTouch的全局浮动按钮"是一种常见的用户界面特性,它为用户提供了一种快速访问常用功能的方式。这个概念借鉴了苹果设备上的AssistiveTouch功能,AssistiveTouch是苹果系统自带的一个...

    仿iPhone的AssistiveTouch 悬浮辅助球工具

    总的来说,仿iPhone的AssistiveTouch悬浮辅助球工具为Android用户带来了与iOS类似的便捷操作方式,不仅提升了用户体验,也为那些不习惯或者不方便使用硬件按键的用户提供了新的选择。这种工具的出现,体现了软件...

    android仿Assistive Touch悬浮按钮

    在Android平台上,我们可以实现一个类似于iOS的Assistive Touch功能,这个功能通常被称为悬浮按钮,它提供了一种便捷的方式,让用户快速访问常用设置或功能。本文将深入探讨如何在Android应用开发中创建这样一个仿...

    swift-FloatView封装的类似iPhone的AssistiveTouch功能的悬浮窗

    "swift-FloatView封装的类似iPhone的AssistiveTouch功能的悬浮窗"就是一个这样的解决方案,它模仿了iPhone上的AssistiveTouch特性,让用户可以在屏幕任意位置通过一个悬浮窗口快速调用预设的操作。 首先,让我们...

    android 拖动类似Iphone AssistiveTouch的快捷键按钮

    在Android平台上,实现类似iPhone的AssistiveTouch功能,可以为用户提供便捷的触控操作,类似于浮动菜单,方便用户快速访问常用功能。这个功能通常包括屏幕截图、返回、主页、多任务等操作,而且可以自定义设置。在...

Global site tag (gtag.js) - Google Analytics