android图标悬浮在底部,Android实现悬浮图片

本文实例为大家分享了Android实现悬浮图片的具体代码,供大家参考,具体内容如下

@SuppressLint("AppCompatCustomView")

public class MoveImageView extends ImageView {

//按下那一刻的坐标和 控件上下左右距离

private float lastX;

private float lastY;

private int left;

private int top;

private int right;

private int bottom;

//如果是拖动事件就不用响应点击事件

boolean isMove = false;

boolean isAnimatoring = false;

//屏幕宽高

private int screenWidthPx;

private int screenHeightPx;

public MoveImageView(Context context) {

this(context, null);

}

public MoveImageView(Context context, @Nullable AttributeSet attrs) {

this(context, attrs, 0);

}

public MoveImageView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

screenWidthPx = getScreenWidthPx(getContext());

screenHeightPx = getScreenHeightPx(getContext());

}

@Override

public boolean onTouchEvent(MotionEvent event) {

switch (event.getAction()) {

case MotionEvent.ACTION_DOWN:

//动画执行过程中,不响应一切操作,

// 这里相当于不让其走后面的MotionEvent.ACTION_MOVE:与MotionEvent.ACTION_UP:

if (isAnimatoring) {

return false;

}

lastX = event.getRawX();

lastY = event.getRawY();

left = getLeft();

top = getTop();

right = getRight();

bottom = getBottom();

break;

case MotionEvent.ACTION_MOVE:

isMove = true;

float x = event.getRawX();

float y = event.getRawY();

int l = (int) (left + (x - lastX));

int t = (int) (top + (y - lastY));

int r = (int) (right + (x - lastX));

int b = (int) (bottom + (y - lastY));

layout(l, t, r, b);

break;

case MotionEvent.ACTION_UP:

if (isMove) {

//如果顶部拖出屏幕外面,回正

if (getTop() < 0) {

layout(getLeft(), 0, getRight(), getHeight());

}

//getBottom() 获取到的是 控件底部到父容器顶部的距离,所以需要减去状态栏的高度

int bottomHeight = screenHeightPx - getStatusBarHeight(getContext());

//如果底部拖出屏幕外面,回正

if (getBottom() > bottomHeight) {

layout(getLeft(), bottomHeight-getHeight(), getRight(), bottomHeight);

}

isMove = false;

startAnimation();

return true;

}

return super.onTouchEvent(event);

}

return super.onTouchEvent(event);

}

private void startAnimation() {

isAnimatoring = true;

//右边距

int marinRight = DisplayUtils.dpToPx(20);

int endValue = screenWidthPx - marinRight;

ValueAnimator animator = ValueAnimator.ofInt(getRight(), endValue);

animator.setDuration(Math.abs(endValue - getRight()) > 1000 ? 1000 : Math.abs(endValue - getRight()));

animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

@Override

public void onAnimationUpdate(ValueAnimator animation) {

int curValue = (int) animation.getAnimatedValue();

layout(curValue - getWidth(), getTop(), curValue, getHeight() + getTop());

}

});

animator.addListener(new AnimatorListenerAdapter() {

@Override

public void onAnimationStart(Animator animation) {

}

@Override

public void onAnimationEnd(Animator animation) {

isAnimatoring = false;

animator.removeAllUpdateListeners();

animator.removeAllListeners();

}

});

animator.start();

}

/**

* 获取状态栏高度

*/

public static int getStatusBarHeight(Context context) {

int result = 24;

int resId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");

if (resId > 0) {

result = context.getResources().getDimensionPixelSize(resId);

} else {

result = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,

result, Resources.getSystem().getDisplayMetrics());

}

return result;

}

public static int getScreenWidthPx(Context context) {

WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);

DisplayMetrics dm = new DisplayMetrics();

if (windowManager != null) {

// windowManager.getDefaultDisplay().getMetrics(dm);

windowManager.getDefaultDisplay().getRealMetrics(dm);

return dm.widthPixels;

}

return 0;

}

public static int getScreenHeightPx(Context context) {

WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);

DisplayMetrics dm = new DisplayMetrics();

if (windowManager != null) {

// windowManager.getDefaultDisplay().getMetrics(dm);

windowManager.getDefaultDisplay().getRealMetrics(dm);

return dm.heightPixels;

}

return 0;

}

}

应用:

布局文件:

xmlns:app="http://schemas.android.com/apk/res-auto"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

tools:context=".TestActivity">

android:layout_width="50dp"

android:id="@+id/MoveImageView"

android:layout_height="50dp"

android:layout_alignParentRight="true"

android:layout_alignParentBottom="true"

android:layout_marginBottom="100dp"

android:layout_marginRight="20dp"

android:src="#ff0000" />

Activity:

public class TestActivity extends AppCompatActivity {

private MoveImageView moveImageView;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_test2);

moveImageView = ((MoveImageView) findViewById(R.id.MoveImageView));

moveImageView.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

Toast.makeText(TestActivity.this, "点击事件", Toast.LENGTH_SHORT).show();

}

});

}

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值