在屏幕上添加一个可移动,可点击的悬浮按钮。

需求:
1.随手指移动。
2.可触发点击事件

实现步骤

在Android Studio的Gradle中导入CircularFloatingActionMenu

dependencies {
    compile 'com.oguzdev:CircularFloatingActionMenu:1.0.2'
}

添加悬浮按钮

-在oncreate方法里调用下面的FloatingActionButton方法.触发事件自己随意添加

private void FloatingActionButton() {
        // Create a button to attach the menu:
        ImageView icon = new ImageView(this); // Create an icon
        icon.setImageResource(R.mipmap.ic_launcher);
        final FloatingActionButton actionButton = new FloatingActionButton.Builder(this)
                .setContentView(icon)
                .build();

        SubActionButton button1 = buildSubActionButton(MainActivity.this, R.drawable.icon_dark_edit);
        SubActionButton button2 = buildSubActionButton(MainActivity.this, R.drawable.icon_dark_edit);
        SubActionButton button3 = buildSubActionButton(MainActivity.this, R.drawable.icon_dark_edit);

        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                SetUpActivity.actionStart(MainActivity.this);
            }
        });
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                MainActivity.actionStart(MainActivity.this);
            }
        });
        button3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                ServerTestActivity.actionStart(MainActivity.this);
            }
        });
        //Create the menu with the items:
        FloatingActionMenu actionMenu = new FloatingActionMenu.Builder(this)
                .addSubActionView(button1)
                .addSubActionView(button2)
                .addSubActionView(button3)
                .attachTo(actionButton)
                .build();

    }

    private SubActionButton buildSubActionButton(Activity activity, int iconResourceId) {
        SubActionButton.Builder itemBuilder = new SubActionButton.Builder(activity);
        ImageView itemIcon = new ImageView(activity);
        itemIcon.setImageResource(iconResourceId);
        return itemBuilder.setContentView(itemIcon).build();
    }

设置悬浮按钮随手指移动

    private int mLastX;
    private int mLastY;
    private int mDownX;
    private int mDownY;
    private final int ADAPTER_VALUE = 25;
actionButton.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                int x = (int) event.getRawX();
                int y = (int) event.getRawY();
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN: {
                        mDownX = (int) event.getRawX();
                        mDownY = (int) event.getRawY();
                        break;
                    }
                    case MotionEvent.ACTION_MOVE: {
                        int deltaX = x - mLastX;
                        int deltaY = y - mLastY;
                        Log.d(TAG, "move, deltaX:" + deltaX + " deltaY:" + deltaY);

                        int translationX = (int) actionButton.getTranslationX() + deltaX;
                        int translationY = (int) actionButton.getTranslationY() + deltaY;
                        actionButton.setTranslationX(translationX);
                        actionButton.setTranslationY(translationY);
                        break;
                    }
                    case MotionEvent.ACTION_UP: {

                        break;
                    }
                    default:
                        break;
                }

                mLastX = x;
                mLastY = y;
                return true;
            }
        });

触发点击事件

因为setOnTouchListener,所以actionButton的点击事件不被触发了,这时候可以在MotionEvent.ACTION_UP中通过callOnClick()触发他的点击事件

                    case MotionEvent.ACTION_UP: {
                        if (rangeInDefined(mDownX, (int) event.getRawX() - ADAPTER_VALUE, (int) event.getRawX() + ADAPTER_VALUE)) {
                            if (rangeInDefined(mDownY, (int) event.getRawY() - ADAPTER_VALUE, (int) event.getRawY() + ADAPTER_VALUE)) {
                                actionButton.callOnClick();
                            }
                        }
                        break;
                    }
要实现可拖动悬浮按钮,可以使用Android中的WindowManager类和LayoutParams类。 首先,在你的Activity或Fragment中创建一个悬浮按钮,例如: ```java Button button = new Button(this); button.setText("悬浮按钮"); ``` 然后,使用WindowManager将该按钮添加屏幕上,并设置其LayoutParams: ```java WindowManager.LayoutParams params = new WindowManager.LayoutParams( WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSLUCENT ); params.gravity = Gravity.TOP | Gravity.START; params.x = 0; params.y = 0; WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); windowManager.addView(button, params); ``` 这里的LayoutParams设置了按钮的宽度和高度为自适应,类型为TYPE_APPLICATION_OVERLAY(表示悬浮在其他应用程序上方),不可获得焦点,透明度为半透明。gravity设置了按钮在屏幕上的位置,x和y设置了按钮的初始位置。 接下来,可以为按钮添加一个触摸监听器,以便用户可以通过拖动来移动按钮: ```java button.setOnTouchListener(new View.OnTouchListener() { private int initialX; private int initialY; private float initialTouchX; private float initialTouchY; @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: initialX = params.x; initialY = params.y; initialTouchX = event.getRawX(); initialTouchY = event.getRawY(); return true; case MotionEvent.ACTION_UP: return true; case MotionEvent.ACTION_MOVE: params.x = initialX + (int) (event.getRawX() - initialTouchX); params.y = initialY + (int) (event.getRawY() - initialTouchY); windowManager.updateViewLayout(button, params); return true; } return false; } }); ``` 在这个触摸监听器中,我们记录了按钮的初始位置和触摸位置,并在移动事件中更新了LayoutParams中的x和y值,并通过WindowManager的updateViewLayout方法更新了按钮的位置。 这样就可以实现一个可拖动的悬浮按钮了。记得要在不需要的时候将其从屏幕上移除: ```java windowManager.removeView(button); ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值