Android悬浮窗的实现

方法有好几种,第一中比较简单,就是在XML里把位置写死

<RelativeLayout
            android:layout_width="@dimen/img_home_float_parent_size"
            android:layout_height="@dimen/img_home_float_parent_size"
            android:layout_alignParentBottom="true"
            android:layout_alignParentRight="true" >

            <ImageView
                android:id="@+id/img_float"
                android:layout_width="@dimen/img_home_float_size"
                android:layout_height="@dimen/img_home_float_size"
                android:layout_alignParentBottom="true"
                android:layout_alignParentRight="true"
                android:layout_marginBottom="@dimen/img_home_float_margin"
                android:layout_marginRight="@dimen/img_home_float_margin"
                android:src="@drawable/img_home_feed_selector" />
        </RelativeLayout>
    </RelativeLayout>

第二种是通过代码往里面放,可以控制位置

private WindowManager mWindowManager = null;
private WindowManager.LayoutParams wmParams = null;
// 用于显示右下角浮动图标
private ImageView img_Float;
private void initFloatImage() {
        // 获取WindowManager
        mWindowManager = (WindowManager) getApplicationContext().getSystemService("window");
        // 设置LayoutParams(全局变量)相关参数
        wmParams = new WindowManager.LayoutParams();

        wmParams.type = LayoutParams.TYPE_PHONE; // 设置window type
        wmParams.format = PixelFormat.RGBA_8888; // 设置图片格式,效果为背景透明
        // 设置Window flag
        wmParams.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL | LayoutParams.FLAG_NOT_FOCUSABLE;

        // 以屏幕左上角为原点,设置xy初始值
        wmParams.x = 400;
        wmParams.y = 400;
        System.out.println("*************"+wmParams.y);
        // 设置悬浮窗口长宽数据
        wmParams.width = 80;
        wmParams.height = 80;
    }
/**
     * 创建悬浮图片按钮
     */
    private void createFloatView() {
        img_Float = new ImageView(this);
        img_Float.setImageResource(R.drawable.ic_launcher);
        img_Float.setAlpha(80);
        img_Float.setOnClickListener(new View.OnClickListener() {
            public void onClick(View arg0) {
                // 点击悬浮图片的事件
            }
        });
        // 调整悬浮窗口
        wmParams.gravity = Gravity.LEFT | Gravity.CENTER_VERTICAL;
        // 显示myFloatView图像
        mWindowManager.addView(img_Float, wmParams);
    }

第三种方法可以自定义控件floatActionBar

package com.faizmalkani.floatingactionbutton;  

import com.nineoldandroids.animation.ObjectAnimator;  
import com.nineoldandroids.view.ViewHelper;  
import android.annotation.SuppressLint;  
import android.content.Context;  
import android.content.res.TypedArray;  
import android.graphics.Bitmap;  
import android.graphics.Canvas;  
import android.graphics.Color;  
import android.graphics.Paint;  
import android.graphics.Point;  
import android.graphics.Rect;  
import android.graphics.drawable.BitmapDrawable;  
import android.graphics.drawable.Drawable;  
import android.os.Build;  
import android.util.AttributeSet;  
import android.view.Display;  
import android.view.MotionEvent;  
import android.view.View;  
import android.view.WindowManager;  
import android.view.animation.AccelerateDecelerateInterpolator;  
import android.view.animation.Interpolator;  
import android.widget.AbsListView;  

//import com.nineoldandroids.animation.ObjectAnimator;  
//import com.nineoldandroids.view.ViewHelper;  

public class FloatingActionButton extends View {  

    private final Interpolator mInterpolator = new AccelerateDecelerateInterpolator();  
    private final Paint mButtonPaint = new Paint(Paint.ANTI_ALIAS_FLAG);  
    private final Paint mDrawablePaint = new Paint(Paint.ANTI_ALIAS_FLAG);  
    private Bitmap mBitmap;  
    private int mColor;  
    private boolean mHidden = false;  
    private Rect rect;  
    private int mLeftDisplayed = -1;  
    private int mRightDisplayed = -1;  
    private int mTopDisplayed = -1;  
    private int mBottomDisplayed = -1;  
    /** 
     * The FAB button's Y position when it is displayed. 
     */  
    private float mYDisplayed = -1;  
    /** 
     * The FAB button's Y position when it is hidden. 
     */  
    private float mYHidden = -1;  

    public FloatingActionButton(Context context) {  
        this(context, null);  
    }  

    public FloatingActionButton(Context context, AttributeSet attributeSet) {  
        this(context, attributeSet, 0);  
    }  


    @SuppressLint("NewApi")  
    public FloatingActionButton(Context context, AttributeSet attrs, int defStyleAttr) {  
        super(context, attrs, defStyleAttr);  

        TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.FloatingActionButton);  
        mColor = a.getColor(R.styleable.FloatingActionButton_color, Color.WHITE);  
        mButtonPaint.setStyle(Paint.Style.FILL);  
        mButtonPaint.setColor(mColor);  
        float radius, dx, dy;  
        radius = a.getFloat(R.styleable.FloatingActionButton_shadowRadius, 10.0f);  
        dx = a.getFloat(R.styleable.FloatingActionButton_shadowDx, 0.0f);  
        dy = a.getFloat(R.styleable.FloatingActionButton_shadowDy, 3.5f);  
        int color = a.getInteger(R.styleable.FloatingActionButton_shadowColor, Color.argb(100, 0, 0, 0));  
        mButtonPaint.setShadowLayer(radius, dx, dy, color);  

        Drawable drawable = a.getDrawable(R.styleable.FloatingActionButton_drawable);  
        if (null != drawable) {  
            mBitmap = ((BitmapDrawable) drawable).getBitmap();  
        }  
        setWillNotDraw(false);  
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)  
            setLayerType(View.LAYER_TYPE_SOFTWARE, null);  

        WindowManager mWindowManager = (WindowManager)  
                context.getSystemService(Context.WINDOW_SERVICE);  
        Display display = mWindowManager.getDefaultDisplay();  
        Point size = new Point();  
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {  
            display.getSize(size);  
            mYHidden = size.y;  
        } else mYHidden = display.getHeight();  
    }  

    public static int darkenColor(int color) {  
        float[] hsv = new float[3];  
        Color.colorToHSV(color, hsv);  
        hsv[2] *= 0.8f;  
        return Color.HSVToColor(hsv);  
    }  

    public void setColor(int color) {  
        mColor = color;  
        mButtonPaint.setColor(mColor);  
        invalidate();  
    }  

    public void setDrawable(Drawable drawable) {  
        mBitmap = ((BitmapDrawable) drawable).getBitmap();  
        invalidate();  
    }  

    public void setShadow(float radius, float dx, float dy, int color) {  
        mButtonPaint.setShadowLayer(radius, dx, dy, color);  
        invalidate();  
    }  

    @Override  
    protected void onDraw(Canvas canvas) {  
        canvas.drawCircle(getWidth() / 2, getHeight() / 2, (float) (getWidth() / 2.6), mButtonPaint);  
        if (null != mBitmap) {  
            canvas.drawBitmap(mBitmap, (getWidth() - mBitmap.getWidth()) / 2,  
                    (getHeight() - mBitmap.getHeight()) / 2, mDrawablePaint);  
        }  
    }  

    @Override  
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {  
        // Perform the default behavior  
        super.onLayout(changed, left, top, right, bottom);  
        if (mLeftDisplayed == -1) {  
            mLeftDisplayed = left;  
            mRightDisplayed = right;  
            mTopDisplayed = top;  
            mBottomDisplayed = bottom;  
        }  

        // Store the FAB button's displayed Y position if we are not already aware of it  
        if (mYDisplayed == -1) {  
            mYDisplayed = ViewHelper.getY(this);  
        }  
    }  

    @Override  
    public boolean onTouchEvent(MotionEvent event) {  
        int color;  
        if (event.getAction() == MotionEvent.ACTION_UP) {  
            color = mColor;  
        } else {  
            color = darkenColor(mColor);  
            rect = new Rect(mLeftDisplayed, mTopDisplayed, mRightDisplayed, mBottomDisplayed);  
        }  
        if (event.getAction() == MotionEvent.ACTION_MOVE){  
            if (!rect.contains(mLeftDisplayed + (int) event.getX(), mTopDisplayed + (int) event.getY())){  
                color = mColor;  
            }  
        }  
        mButtonPaint.setColor(color);  
        invalidate();  
        return super.onTouchEvent(event);  
    }  

    public void hide(boolean hide) {  
        // If the hidden state is being updated  
        if (mHidden != hide) {  

            // Store the new hidden state  
            mHidden = hide;  

            // Animate the FAB to it's new Y position  
            ObjectAnimator animator = ObjectAnimator.ofFloat(this, "y", mHidden ? mYHidden : mYDisplayed).setDuration(500);  
            animator.setInterpolator(mInterpolator);  
            animator.start();  
        }  
    }  

    public void listenTo(AbsListView listView) {  
        if (null != listView) {  
            listView.setOnScrollListener(new DirectionScrollListener(this));  
        }  
    }  
}  
package com.faizmalkani.floatingactionbutton;  

import android.view.View;  
import android.widget.AbsListView;  

class DirectionScrollListener implements AbsListView.OnScrollListener {  

    private static final int DIRECTION_CHANGE_THRESHOLD = 1;  
    private final FloatingActionButton mFloatingActionButton;  
    private int mPrevPosition;  
    private int mPrevTop;  
    private boolean mUpdated;  

    DirectionScrollListener(FloatingActionButton floatingActionButton) {  
        mFloatingActionButton = floatingActionButton;  
    }  

    @Override  
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {  
        final View topChild = view.getChildAt(0);  
        int firstViewTop = 0;  
        if (topChild != null) {  
            firstViewTop = topChild.getTop();  
        }  
        boolean goingDown;  
        boolean changed = true;  
        if (mPrevPosition == firstVisibleItem) {  
            final int topDelta = mPrevTop - firstViewTop;  
            goingDown = firstViewTop < mPrevTop;  
            changed = Math.abs(topDelta) > DIRECTION_CHANGE_THRESHOLD;  
        } else {  
            goingDown = firstVisibleItem > mPrevPosition;  
        }  
        if (changed && mUpdated) {  
            mFloatingActionButton.hide(goingDown);  
        }  
        mPrevPosition = firstVisibleItem;  
        mPrevTop = firstViewTop;  
        mUpdated = true;  
    }  

    @Override  
    public void onScrollStateChanged(AbsListView view, int scrollState) {  
    }  
}  

以上内容均来自网络,作为私人笔记记下来

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值