自定义粘性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();
}
}