移动开发最新Android自定义可拖拽的悬浮按钮---DragFloatingActionButton,阿里三面不过会通知吗

总结:

面试是一个不断学习、不断自我提升的过程,有机会还是出去面面,至少能想到查漏补缺效果,而且有些知识点,可能你自以为知道,但让你说,并不一定能说得很好。

有些东西有压力才有动力,而学到的知识点,都是钱(因为技术人员大部分情况是根据你的能力来定级、来发薪水的),技多不压身。

附上我的面试各大专题整理: 面试指南,满满的都是干货,希望对大家有帮助!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

如图:

这里写图片描述

FloatingActionButton正常显示的情况下有个填充的颜色,有个阴影;点击的时候会有一个rippleColor,并且阴影的范围可以增大。其中:

1、填充的颜色默认使用就是style当中的colorAccent。

2、rippleColor默认取的是Theme当中的colorControlHighlight。

3、elevation和pressedTranslationZ,前者用户设置正常显示的阴影大小;后者是点击时显示的阴影大小。

好了,现在介绍本文的重点:可拖拽的,有吸附功能的悬浮按钮

先上代码。


import android.animation.ObjectAnimator;

import android.content.Context;

import android.support.design.widget.FloatingActionButton;

import android.util.AttributeSet;

import android.util.Log;

import android.view.MotionEvent;

import android.view.animation.DecelerateInterpolator;



public class DragFloatActionButton extends FloatingActionButton {



    private int screenWidth;

    private int screenHeight;

    private int screenWidthHalf;

    private int statusHeight;

    private int virtualHeight;



    public DragFloatActionButton(Context context) {

        super(context);

        init();

    }



    public DragFloatActionButton(Context context, AttributeSet attrs) {

        super(context, attrs);

        init();

    }



    public DragFloatActionButton(Context context, AttributeSet attrs, int defStyleAttr) {

        super(context, attrs, defStyleAttr);

        init();

    }



    private void init() {

        screenWidth = ScreenUtils.getScreenWidth(getContext());

        screenWidthHalf = screenWidth / 2;

        screenHeight = ScreenUtils.getScreenHeight(getContext());

        statusHeight = ScreenUtils.getStatusHeight(getContext());

        virtualHeight=ScreenUtils.getVirtualBarHeigh(getContext());

    }



    private int lastX;

    private int lastY;



    private boolean isDrag;



    @Override

    public boolean onTouchEvent(MotionEvent event) {

        int rawX = (int) event.getRawX();

        int rawY = (int) event.getRawY();

        switch (event.getAction() & MotionEvent.ACTION_MASK) {

            case MotionEvent.ACTION_DOWN:

                isDrag = false;

                getParent().requestDisallowInterceptTouchEvent(true);

                lastX = rawX;

                lastY = rawY;

                Log.e("down---->", "getX=" + getX() + ";screenWidthHalf=" + screenWidthHalf);

                break;

            case MotionEvent.ACTION_MOVE:

                isDrag = true;

                //计算手指移动了多少

                int dx = rawX - lastX;

                int dy = rawY - lastY;

                //这里修复一些手机无法触发点击事件的问题

                int distance= (int) Math.sqrt(dx*dx+dy*dy);

                Log.e("distance---->",distance+"");

                if(distance<3){//给个容错范围,不然有部分手机还是无法点击

                    isDrag=false;

                    break;

                }



                float x = getX() + dx;

                float y = getY() + dy;



                //检测是否到达边缘 左上右下

                x = x < 0 ? 0 : x > screenWidth - getWidth() ? screenWidth - getWidth() : x;

               // y = y < statusHeight ? statusHeight : (y + getHeight() >= screenHeight ? screenHeight - getHeight() : y);

               if (y<0){

                   y=0;

               }

               if (y>screenHeight-statusHeight-getHeight()){

                   y=screenHeight-statusHeight-getHeight();

                }

                setX(x);

                setY(y);



                lastX = rawX;

                lastY = rawY;

                Log.e("move---->", "getX=" + getX() + ";screenWidthHalf=" + screenWidthHalf + " " + isDrag+"  statusHeight="+statusHeight+ " virtualHeight"+virtualHeight+ " screenHeight"+ screenHeight+"  getHeight="+getHeight()+" y"+y);

                break;

            case MotionEvent.ACTION_UP:

                if (isDrag) {

                    //恢复按压效果

                    setPressed(false);

                    Log.e("ACTION_UP---->", "getX=" + getX() + ";screenWidthHalf=" + screenWidthHalf);

                    if (rawX >= screenWidthHalf) {

                        animate().setInterpolator(new DecelerateInterpolator())

                                .setDuration(500)

                                .xBy(screenWidth - getWidth() - getX())

                                .start();

                    } else {

                        ObjectAnimator oa = ObjectAnimator.ofFloat(this, "x", getX(), 0);

                        oa.setInterpolator(new DecelerateInterpolator());

                        oa.setDuration(500);

                        oa.start();

                    }

                }

                Log.e("up---->",isDrag+"");

                break;

        }

        //如果是拖拽则消耗事件,否则正常传递即可。

        return isDrag || super.onTouchEvent(event);



    }

}

ScreenUtils.java


package com.example.cmos.retrofitdemo;



import android.app.Activity;

import android.content.Context;

import android.graphics.Rect;

import android.util.DisplayMetrics;

import android.view.Display;

import android.view.Window;

import android.view.WindowManager;



import java.lang.reflect.Method;



/**

 * Created by gongwq on 2017/6/14 0014.

 */



public class ScreenUtils {



    private ScreenUtils() {

        /* cannot be instantiated */

        throw new UnsupportedOperationException("cannot be instantiated");

    }



    /**

     * 获得屏幕高度

     *

     * @param context

     * @return

     */

    public static int getScreenWidth(Context context) {

        WindowManager wm = (WindowManager) context

                .getSystemService(Context.WINDOW_SERVICE);

        DisplayMetrics outMetrics = new DisplayMetrics();

        wm.getDefaultDisplay().getMetrics(outMetrics);

        return outMetrics.widthPixels;

    }



    /**

     * 获得屏幕宽度

     *

     * @param context

     * @return

     */

    public static int getScreenHeight(Context context) {

        WindowManager wm = (WindowManager) context

                .getSystemService(Context.WINDOW_SERVICE);

        DisplayMetrics outMetrics = new DisplayMetrics();

        wm.getDefaultDisplay().getMetrics(outMetrics);

        return outMetrics.heightPixels;

    }



    /**

     * 获得状态栏的高度

     *

     * @param context

     * @return

     */

    public static int getStatusHeight(Context context) {



        int statusHeight = -1;

        try {

            Class<?> clazz = Class.forName("com.android.internal.R$dimen");

            Object object = clazz.newInstance();

            int height = Integer.parseInt(clazz.getField("status_bar_height")

                    .get(object).toString());

            statusHeight = context.getResources().getDimensionPixelSize(height);

        } catch (Exception e) {

            e.printStackTrace();

        }


### 最后

简历首选内推方式,速度快,效率高啊!然后可以在拉钩,boss,脉脉,大街上看看。简历上写道熟悉什么技术就一定要去熟悉它,不然被问到不会很尴尬!做过什么项目,即使项目体量不大,但也一定要熟悉实现原理!不是你负责的部分,也可以看看同事是怎么实现的,换你来做你会怎么做?做过什么,会什么是广度问题,取决于项目内容。但做过什么,达到怎样一个境界,这是深度问题,和个人学习能力和解决问题的态度有关了。大公司看深度,小公司看广度。大公司面试你会的,小公司面试他们用到的你会不会,也就是岗位匹配度。

选定你想去的几家公司后,先去一些小的公司练练,学习下面试技巧,总结下,也算是熟悉下面试氛围,平时和同事或者产品PK时可以讲得头头是道,思路清晰至极,到了现场真的不一样,怎么描述你所做的一切,这绝对是个学术性问题!

面试过程一定要有礼貌!即使你觉得面试官不尊重你,经常打断你的讲解,或者你觉得他不如你,问的问题缺乏专业水平,你也一定要尊重他,谁叫现在是他选择你,等你拿到offer后就是你选择他了。

金九银十面试季,跳槽季,整理面试题已经成了我多年的习惯!**在这里我和身边一些朋友特意整理了一份快速进阶为Android高级工程师的系统且全面的学习资料。涵盖了Android初级——Android高级架构师进阶必备的一些学习技能。**

附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

![](https://img-blog.csdnimg.cn/img_convert/ad45f569a12b90064a3c75407810fc90.webp?x-oss-process=image/format,png)



**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化学习资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618156601)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

学习技能。**

附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

[外链图片转存中...(img-PGfttNha-1715444842473)]



**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化学习资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618156601)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android全局拖动悬浮按钮是一种在应用界面上悬浮按钮,用户可以通过拖动按钮的方式,在任意界面使用其提供的功能。这种悬浮按钮通常呈现在屏幕的某个固定位置,如屏幕右下角。 使用全局拖动悬浮按钮可以为用户提供方便和快捷的操作方式。用户只需通过轻触按钮即可快速打开某个应用或执行某个功能,而不需要返回主界面或搜索相应的功能选项。这样可以大大提高用户的操作效率和体验。 开发这一功能的关键在于如何实现悬浮按钮在全局范围内的拖动和点击事件。一种常用的方法是通过在Android系统的WindowManager中创建一个可拖动的View,并设置其触摸事件监听器来实现。在触摸事件监听器中,我们可以处理按钮拖动、点击、长按等各种事件。 为了使全局拖动悬浮按钮更好地融入应用界面,我们可以对其进行自定义设置。例如,可以自定义按钮的形状、颜色、动画效果等,以适配不同的应用主题和风格。 需要注意的是,在设计和使用全局拖动悬浮按钮时,我们要遵循用户界面设计的基本原则,避免对用户的正常操作造成干扰和困扰。同时,也要考虑到移动设备的屏幕尺寸和分辨率的差异,以确保全局拖动悬浮按钮在不同设备上都能够正常显示和操作。 总而言之,Android全局拖动悬浮按钮是一种方便用户操作的功能,通过简单轻松的拖动和点击,用户可以快速访问应用的各种功能。开发者可以根据应用的需求和用户体验考虑,来设计和实现这一功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值