自定义粘性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
- 自定义粘性View (备忘)
- 自定义View之粘性下拉刷新效果
- 自定义view进阶-贝塞尔曲线实现水波动画、粘性控件
- 粘性滑动-自定义StickinessView
- 自定义粘性下拉刷新
- android 自定义粘性View,可寄生于其他控件给予其添加半透明spinner的效果
- Android 自定义带有粘性的Scrollview
- 自定义实现顶部粘性下拉刷新效果
- 自定义控件:QQ气泡效果粘性控件的实现
- 自定义注册模块备忘
- maven自定义打包备忘
- 备忘 textview 自定义
- 自定义view
- 自定义View
- 自定义view
- 自定义View
- 自定义View
- 自定义view
- ORACLE SQL性能优化系列 (三)
- JavaEE_JSP_JSTL标签 参考手册
- cocos2d-x开发学习笔记(一)
- Linux中vi编辑器
- 调试 make
- 自定义粘性View (备忘)
- ORACLE SQL性能优化系列 (二)
- 获取本机IP地址以及本机名称
- Java源码 SpringMVC Mybatis Shiro Bootstrap Rest Webservice java后台框架
- 自定义布局的Dialog无法关闭问题
- iOS Autolayout笔记
- ORACLE SQL性能优化系列 (一)
- 立即自执行函数和分组操作符
- Hdoj find the mincost route