黏性控件的使用
来源:互联网 发布:广告宣传音频制作软件 编辑:程序博客网 时间:2024/06/18 03:59
在qq上面用一个红色的黏性控件来表示消息已读或未读。可拖动。今天就来分享一下如何实现这个功能。我们需要的jar包是nineoldandroids-2.4.0.jar,还需要一个开源的几何工具类GeometryUtil.java。
应用场景: 未读提醒的清除
1.画静态图
//1.画固定圆canvas.drawCircle(mStickCenter.x,mStickCenter.y,mStickRadious, mPaint);//2.画拖拽圆 canvas.drawCircle(mDragCenter.x,mDragCenter.y,mDragRadius, mPaint);
2.把静态的数值变成变量(计算得到真实的变量)
// 3. 获取控制点坐标 mControlPoint = GeometryUtil.getMiddlePoint(mDragCenter, mStickCenter); // 保存画布状态 canvas.save(); canvas.translate(0, -statusBarHeight); // 画出最大范围(参考用) mPaint.setStyle(Style.STROKE); canvas.drawCircle(mStickCenter.x, mStickCenter.y, farestDistance, mPaint); mPaint.setStyle(Style.FILL);
3.不断地修改变量, 重绘界面, 动起来了.
// 计算连接点值, 控制点, 固定圆半径 // 1. 获取固定圆半径(根据两圆圆心距离) float tempStickRadius = getTempStickRadius(); // 2. 获取直线与圆的交点 float yOffset = mStickCenter.y - mDragCenter.y; float xOffset = mStickCenter.x - mDragCenter.x; Double lineK = null; if(xOffset != 0){ lineK = (double) (yOffset / xOffset); } // 通过几何图形工具获取交点坐标 mDragPoints = GeometryUtil.getIntersectionPoints(mDragCenter, mDragRadius, lineK); mStickPoints = GeometryUtil.getIntersectionPoints(mStickCenter, tempStickRadius, lineK);
4.功能分析:
a. 拖拽超出范围,断开, 松手, 消失
b. 拖拽超出范围,断开,放回去了,恢复
c. 拖拽没超出范围, 松手,弹回去
case MotionEvent.ACTION_UP: if(isOutofRange){ float d = GeometryUtil.getDistanceBetween2Points(mDragCenter, mStickCenter); if(d > farestDistance){ // a. 拖拽超出范围,断开, 松手, 消失 isDisappear = true; invalidate(); }else { //b. 拖拽超出范围,断开,放回去了,恢复 updateDragCenter(mStickCenter.x, mStickCenter.y); } }else {// c. 拖拽没超出范围, 松手,弹回去 final PointF tempDragCenter = new PointF(mDragCenter.x, mDragCenter.y); ValueAnimator mAnim = ValueAnimator.ofFloat(1.0f); mAnim.addUpdateListener(new AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator mAnim) { // 0.0 -> 1.0f float percent = mAnim.getAnimatedFraction(); PointF p = GeometryUtil.getPointByPercent(tempDragCenter, mStickCenter, percent); updateDragCenter(p.x, p.y); } }); mAnim.setInterpolator(new OvershootInterpolator(4)); mAnim.setDuration(500); mAnim.start(); } break;
1 0
- 黏性控件的使用
- “诱惑“用户-提高用户使用黏性的方法
- iOS 去除tableview的黏性
- tableView 的headView黏性问题
- 移动游戏的用户黏性
- 网站如何吸引用户的黏性
- UITableView 取消headerView的黏性,但是不能取消footerView的黏性
- 去掉UITableView的header和footer的黏性效果
- EventBas简单的黏性事件传值的简单实现
- EventBus的StickyEvents黏性事件详解及使用说明
- 静态广播、动态广播以及黏性广播的无序显示
- iOS版QQ的黏性下拉刷新效果简易实现
- EventBus黏性事件(简单的登录传值)
- CListCtrl控件控件的使用
- EventBus使用步骤(二):黏性事件(每天学一点)
- Android开发之使用贝塞尔曲线实现黏性水珠下拉效果
- 黏性Session和非黏性Session
- 黏性Session和非黏性Session
- tinyhttpd 剖析
- TargetAction&&Recognizer
- SDUT AOE关键路径 SPFA求最长路(倒序建路)
- 月薪过万成长过程
- left join加where还是on
- 黏性控件的使用
- 8成微商都容易忽略这5种营销细节
- 设备驱动的艺术之旅 - Platform 总线的应用
- 我的图形学学习之旅
- Android中事件分发机制
- Field BSEG-MWSKZ . does not exist in the screen SAPMF05A 0300 Message no. 00349
- Web Worker
- accept与connect的超时设置
- 进行中小企业网站建设要注意哪些问题?