当前位置 主页 > 网站技术 > 代码类 >

    Android自定义View实现自动吸附功能

    栏目:代码类 时间:2020-01-18 18:10

    本文实例为大家分享了Android实现自动吸附功能的具体代码,供大家参考,具体内容如下

    1.简述

    最近开发app过程中要实现拖动view后要可以自动吸附功能,所以需要自定义view来在onTouchEvent中来利用动画来实现此功能

    2.功能代码部分

    import android.content.Context;
    import android.graphics.Canvas;
    import android.util.AttributeSet;
    import android.util.Log;
    import android.view.MotionEvent;
    import android.view.animation.DecelerateInterpolator;
    import android.widget.ImageView;
    
    public class AdsorbentViews extends ImageView {
     
     private int maxWidth;
      private int maxHeight;
      private int viewWidth;
      private int viewHeight;
      private float downx;
      private float downy;
      private Context mContext;
      public CustomViews(Context context) {
        this(context, null);
      }
     
      public CustomViews(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
      }
     
      public CustomViews(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        mContext = context;
      }
      @Override
      protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        DisplayMetrics outMetrics = new DisplayMetrics();
        WindowManager windowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
        windowManager.getDefaultDisplay().getRealMetrics(outMetrics);
        //屏幕的宽度
        maxWidth = outMetrics.widthPixels;
        //屏幕的高度
        maxHeight = outMetrics.heightPixels;
        /**
         * 控件的宽高
         */
        viewWidth = canvas.getWidth();
        viewHeight = canvas.getHeight();
      }
      @Override
      public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
          case MotionEvent.ACTION_DOWN:
            clearAnimation();
            downx = event.getX();
            downy = event.getY();
            return true;
          case MotionEvent.ACTION_MOVE:
            float moveX = event.getRawX() - downx;
            float moveY = event.getRawY() - downy;
            moveX = moveX < 0 ? 0 : (moveX + viewWidth > maxWidth) ? (maxWidth - viewWidth) : moveX;
            moveY = moveY < 0 ? 0 : (moveY + viewHeight) > maxHeight ? (maxHeight - viewHeight) : moveY;
            this.setY(moveY);
            this.setX(moveX);
            return true;
          case MotionEvent.ACTION_UP:
            //做吸附效果
            float centerX = getX() + viewWidth / 2;
            if (centerX > maxWidth/2){
              //靠右吸附
              animate().setInterpolator(new DecelerateInterpolator())
                  .setDuration(500)
                  .x(maxWidth-viewWidth)
                  .y(maxHeight-viewHeight)
                  .start();
            }else {
              animate().setInterpolator(new DecelerateInterpolator())
                  .setDuration(500)
                  .x(0)
                  .y(maxHeight-viewHeight)
                  .start();
            }
            return true;
          default:
            return super.onTouchEvent(event);
        }
      }
    }

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