自定义粘性View (备忘)

来源:互联网 发布:2017网络彩票最新新闻 编辑:程序博客网 时间:2024/04/28 21:37

自定义粘性View (备忘)

加深记忆,自己手打出来,应该跑不起来,有bug

代码块

    public class MImg extends Imageview{        private Context context;        private View parentView;        //屏幕宽高        private int ScreenWidth;        private int ScreenHeight;        private MOnClickListener listener;        private LinearLayout.LayoutParams lp;        //定时器,用于判断长按或点击        private TimerTask task;        private Timer timer=new Timer();        private boolean isLoingPress,isMove,mFlag;        private int downX,downY,lastX,lastY,height;        //状态栏高度        private int statusBarHeight=-1;        //当前view的宽度        private int width=-1;        public MImg(Context context,View v,int left,int top){            super(context)            this.context=context;            this.parentView=view;                                            lp=newLayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,            LinearLayout.LayoutParams.WRAP_CONTENT);            DisplayMetrics dm=new DisplayMetrics();            ((Activity)context).getWindowManger.getDefaultDisplay.getMetrices(dm);            screenWidth=dm.getWidthPixels();            screenHeight=dm.getHeightPixels();            lp.setMargin(left,top,0,0);            setLayoutParams(lp);        }        public MImg(Context context, AttributeSet attrs) {            super(context, attrs);        }        public MImg(Context context, AttributeSet attrs, int defStyle) {            super(context, attrs, defStyle);        }        public void SetListener(MOnClickListener listener){            this.listener=listener;        }        private void setTimerTask(){            if(task!=null){                task.cancel();            }            //是否抬起手指            if (mFlag) {                     setBackgroundResource(R.drawable.play1);                    } else {                         if (!isMove) {                        listener.onLongPress();                        isLongPress = true;                    }            timer.schedule(task, 300);        }        @Override    public boolean onTouchEvent(MotionEvent event) {        int action=event.getAction();        switch(action){            case MotionEvent.ActionDown:                downX=lastX=event.getX();                downY=lastY=event.getY();                mFlag=false;                onLongPress=false;                setTimerTask();                //获取状态栏高度                if(statusBarHeight==-1){                    int [] location=new int[2];                    parentView.getLocationOnScreen(location);                    statusBarHeight=location[1];                }                if(width==-1){                    width=this.getWidth();                    heigh=this.getHeight();                }                break;            case MotionEvent.ActionMove:                //记录与上次的距离                int dx=(int)event.getRawX()-lsatX;                int dy=(int)event.getRawY()-lastY;                //首次移动,记录从开始点移动的距离                if(!isMove){                    int dx1=Math.abs(event.getRawX)-downX;                    int dy1=Math.abs(event.getRawY)=downY;                    //如果移动大于20像素,设置标志位为true                    if(dx1>20||dy1>20){                        isMove=true;                    }                }                //只是手指的移动,view没动                int top=this.getTop+dy;                int left=this.getLeft+dx;                if(top<0){                    top=0;                }                if(left<0){                    left=0;                 }                if(top>scrrenHeight-statusBarHeight){                    top=scrrenHeight-statusBarHeight;                   }                if(left>screenWidth){                    left=screenWidth                }                lp.setMargins(left,top,0,0);                setLayoutParams(lp);                break;            case MotionEvnet.ActionUP:                setTimerTask();                if (!isMove && !isLongPress) {                    myListener.onClick();                }                int mtop=scrrenHeight-statusHeight- Math.abs((int)event.getRawX());                int mleft=Math.abs((int)event.getRawY());                int edge=getEdge(mtop,mleft);                int top=this.getTop;                int left=this.getLeft;                switch(edge){                //贴在右边                    case 0:                        left=screenWihdth-width;                    break;                //贴在左边                    case 1:                        left=0;                    break;                //贴在下边                    case 2:                    top=screenHeightstatusHeight-height;                    break;                }                lp.setMargins(left,top,0,0);                setLayoutParams(lp);                break;        }        return ture;    }        private int getEdge(top,left){                int edge=0;                if(left<screenWidth-left){                    edge=1;                    if(top<left){                        edge=2;                    }                }else{                    if(top<screenWidth-left){                        edge=2;}                }                return edge;        }        public interface MOnClickListener{            public void onClick();            public void onLongPrress();        }    }
0 0
原创粉丝点击