栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 移动开发 > Android

Android自定义View实现拖动选择按钮

Android 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Android自定义View实现拖动选择按钮

本文为大家分享了Android实现拖动选择按钮的具体代码,供大家参考,具体内容如下

效果图

View代码

第一步:自定义属性

 
  
  
  
 

第二步:自定义圆形

public class CircleView extends View {
 
 private final int DEFAULT_COLOR = Color.LTGRAY;
 
 private final float DEFAULT_RADIUS = 32;
 private int mColor;
 private Paint mCirclePaint;
 private float mRadius;
 private float mCenterX;
 private float mCenterY;

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

 public CircleView(Context context, AttributeSet attrs)
 {
  this(context, attrs, 0);
 }

 public CircleView(Context context, AttributeSet attrs, int defStyleAttr)
 {
  super(context, attrs, defStyleAttr);
  TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.DragView);
  mColor = array.getColor(R.styleable.DragView_color_circle,DEFAULT_COLOR);
  mCirclePaint = new Paint();
  mCirclePaint.setColor(mColor);

  mCenterY = mCenterX = mRadius = getMeasuredWidth() == 0?DEFAULT_RADIUS:getMeasuredWidth()/2;
  array.recycle();
 }

 public float getRadius(){
  return mRadius;
 }

 public int getColor()
 {
  return mColor;
 }

 @Override
 protected void onDraw(Canvas canvas)
 {
  canvas.drawCircle(mCenterX,mCenterY,mRadius,mCirclePaint);
 }
}

第三步:自定义拖动按钮

public class DragView extends RelativeLayout implements View.onTouchListener {

 private Drawable mDragIcon;//拖动图标
 private ImageView mDragView;//拖动图标ImageView
 private int mCircleColor;//圆的颜色
 private Context mContext;//上下文
 private int mDotNum;//节点数量

 private int mWidth;//组件的宽度
 private int mHight;//组件的高度
 private int mCircleRadius;//园的半径
 private int mDragWidth;//拖动图标的宽度
 private int mLineWidth,mLineHeight;//中间线的长宽

 private float mStartX;//开始拖动的屏幕坐标
 private float mCurX;//开始拖动的触点坐标
 private float mMinX;//拖动范围的最小值
 private float mMaxX;//拖动范围的最大值

 private onNodeSelect mOnNodeSelect;//回调接口

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

 public DragView(Context context, AttributeSet attrs) {
  this(context, attrs,0);
 }

 public DragView(Context context, AttributeSet attrs, int defStyleAttr) {
  super(context, attrs, defStyleAttr);
  TypedArray array=context.obtainStyledAttributes(attrs, R.styleable.DragView);
  mDragIcon=array.getDrawable(R.styleable.DragView_icon_drag);
  mCircleColor=array.getColor(R.styleable.DragView_color_circle,Color.WHITE);
  mDotNum=array.getInt(R.styleable.DragView_dot_num,2);
  array.recycle();
  mContext=context;
  initView();
 }

 
 public void initView(){
  for (int i=0;i= 0 && x <= mMaxX - mMinX) {
      v.setTranslationX(mCurX + event.getRawX() - mStartX);
     }

     break;

    case MotionEvent.ACTION_UP:
    case MotionEvent.ACTION_CANCEL:

     int distance=(int) (event.getRawX()-mStartX);
     if (distance>0){
      if (Math.abs(distance)>mLineWidth/2){
v.setTranslationX(mCurX + event.getRawX() - mStartX);
setAnim(mLineWidth,1);
      }else {
v.setTranslationX(mCurX + event.getRawX() - mStartX);
setAnim(0,0);
      }
     }else if (distance<0){
      if (Math.abs(distance)>mLineWidth/2){
v.setTranslationX(mCurX + event.getRawX() - mStartX);
setAnim(0,0);
      }else {
v.setTranslationX(mCurX + event.getRawX() - mStartX);
setAnim(mLineWidth,1);
      }
     }

     break;
   }
  }else if (v instanceof CircleView){
   switch (event.getAction()) {
    case MotionEvent.ACTION_UP:
     if (event.getRawX()>getDisplayWidth()/2){
      setAnim(mLineWidth,1);
     }else {
      setAnim(0,0);
     }
     break;
   }
  }
  return true;
 }

 //设置平移动画
 private void setAnim(float moveX, final int scrollPosition) {
  ObjectAnimator animator = ObjectAnimator.ofFloat(mDragView, "translationX", mDragView.getTranslationX(), moveX);
  animator.setDuration(300);
  animator.start();
  if (monNodeSelect != null) {
   mOnNodeSelect.onNodeSelect(scrollPosition);
  }
 }

 public void setNodeSelectListener(onNodeSelect onNodeSelect) {
  monNodeSelect = onNodeSelect;
 }

 //事件回调接口
 public interface onNodeSelect {
  void onNodeSelect(int position);
 }

 //dp转px
 public int dp2px(Context context, float dpValue)
 {
  final float scale = context.getResources().getDisplayMetrics().density;
  return (int) (dpValue * scale + 0.5f);
 }

 //获取屏幕宽度
 public int getDisplayWidth(){
  DisplayMetrics metrics=new DisplayMetrics();
  ((Activity)mContext).getWindowManager().getDefaultDisplay().getMetrics(metrics);
  return metrics.widthPixels;
 }
}

使用方法

布局文件:

 

页面代码:

 dragView=(DragView)view.findViewById(R.id.view_drag);
 dragView.setNodeSelectListener(new DragView.onNodeSelect() {
  @Override
  public void onNodeSelect(int position) {
   Toast.makeText(getActivity(),"我选择了"+position,Toast.LENGTH_SHORT).show();
  }
 });

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/162453.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号