方法有好几种,第一中比较简单,就是在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;
// 以屏幕左上角为原点,设置x、y初始值
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) {
}
}
以上内容均来自网络,作为私人笔记记下来