我想知道谁是谁的爱你们的分析

百度拇指医生
&&&普通咨询
您的网络环境存在异常,
请输入验证码
验证码输入错误,请重新输入10875人阅读
Android基础知识(3)
本文版权所有,转载请注明:
网上关于Android 的view坐标挺多的,写这篇的目的是因为网上搜到的文章大多较简单,几乎都是简单的介绍下获取的几个方法坐标的几个方法罢了,但在实战中,你会发现可能你学会的那几个获取坐标的方法并没有正确的使用,导致当你要计算坐标的时候可能会试过几遍才找到正确的办法(其实这也正是我容易混淆的地方,所以特地写篇博客记录下)
关于那几个获取坐标的方法我就懒得说了
(这篇博客有记载,大家可以去看看)
大体的方法就是这些了
下面借用那篇博客的一张图:
view提供的方法
getTop:获取到的,是view自身的顶边到其父布局顶边的距离
getLeft:获取到的,是view自身的左边到其父布局左边的距离
getRight:获取到的,是view自身的右边到其父布局左边的距离
getBottom:获取到的,是view自身的底边到其父布局顶边的距离
MotionEvent提供的方法
getX():获取点击事件相对控件左边的x轴坐标,即点击事件距离控件左边的距离
getY():获取点击事件相对控件顶边的y轴坐标,即点击事件距离控件顶边的距离
getRawX():获取点击事件相对整个屏幕左边的x轴坐标,即点击事件距离整个屏幕左边的距离
getRawY():获取点击事件相对整个屏幕顶边的y轴坐标,即点击事件距离整个屏幕顶边的距离
下面做个测试
分别点击A点,B点后效果
这里需要注意的是:
点击B点后(可以看到先是回调TestTextView中的onTouchEvent方法,然后才是MainActivity中的onTouchEvent,因为我在二者的onTouchEvent方法中都没有进行点击事件的消费处理,所以会往上传递,突然扯到了事件分发机制,2333~这里就是突然想补充一点,还是扯回坐标吧)
1.TestTextView中getY和getRawY取得的值不一样,这点我们可以理解
2.MainActivity中getY和getRawY取得的值一样!(我们注意到点击A,B点都是如此)
这里我们得到一条启发:
getY和getRawY这一系动作都是由MotionEvent来定义产生的。是得看最后MotionEvent是被哪个View所消耗。如果MotionEvent没有被任何View所消耗,最终返回Activity则getY和getRawY则一致。如果被View所消耗,则具体情况具体分析,getY,getRawY可能一致,也可能不一致。
测试2:类似在ListView这种有滚动轴的控件中会是什么样的呢?
这个打印我忘记截图完整了,这里我说明下打印的log我是在ListView所在的activity中的dispatchTouchEvent,之所以不在activity的onTouchEvent中打印是因为ListView中的item消费了事件,那么这个activity的onTouchEvent就不会打印出Log了。
public boolean dispatchTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
LogUtil.m("SecondActivity
getX " + event.getX() + " getY " + event.getY());
LogUtil.m("SecondActivity
getrawx " + event.getRawX() + " getrawy " + event.getRawY());
return super.dispatchTouchEvent(event);
这次我们点击的是item7的顶部。
(PS:这时可能会有点好奇,我们明明点击的接近是item7的顶部,为啥得到的Y指却不是接近0呢,原因后面讲)
这里我们得到一条启发:
对于这种滑动的ViewGroup,我们在获取ViewGroup的坐标值时并不需要考虑它到底滑动了多少(实际滑动的我们应该看作是ViewGroup中的View在滑动)
在上面我们留下了一个疑问:我们明明点击的接近是item7的顶部,得到的Y指却不是接近0。
原因在于getRawY返回的是点击事件距离整个屏幕顶边的距离,所以点击item7的顶部,得到的Y值其实就是状态栏的值。
当然我们有时候碰到的不仅就只有状态栏,有时候是状态栏与标题栏并存的。所以我们在获取ViewGroup的Y值是一定要注意是否需要减去状态栏,标题栏(如果有)的高度,否则计算得到的Y值并不是正确的。
这里为了让大家更清晰的了解,大家可以看看这篇文章(Android4.0窗口机制和创建过程分析 )
下面我们用图来初略说明(这是我的理解,有误欢迎指正)
现在我们再来说说怎么取得坐标值的时机
因为MotionEvent提供的获取坐标的方法是在页面完完全全显示在用户眼前且用户点击后才会使用到的方法,所以并不存在获取不到的问题,下面就论述下
view提供的获取坐标方法
看到这,你可能会说,那还不简单当布局被加载出来的时候,我们去获取不就OK了吗?
于是我们就会看到这样的错误:在一个Activity的onCreate方法中,设置完setContentView后,就开始View的getLeft,getTop等方法,结果发现为0,为啥?
原因就是:
对于View,ViewGroup来说,width、height、top、left等属性值是在Measure与Layout过程完成之后才开始正确赋值的,而Measure与Layout却都晚于onCreate方法执行,所以onCreate中getLeft根本就取不到值!
那要是我们想要在onCreate中取到我们想要的值,我们应该怎么做呢?
大家可以参考这两篇博文
我觉得写得很好了
归纳如下:
监听Draw/Layout事件:ViewTreeObserver
将一个runnable添加到Layout队列中:View.post()
重写View的onLayout方法
重写Activity的onWindowFocusChanged方法,在该方法中获取
这里我推荐2,4这两种,即
view.post(new Runnable() {
public void run() {
view.getHeight();
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
现在对坐标系是咋样的,我们已经了解了。
对啥时候获取,以及获取后是否需要纠正得到正确的Y,我们也已经分析了。
下面就来说说本文的重头戏 ——— 坐标的计算。
(之所以说是重头戏,是因为我们之前得到的都是一个点的正确坐标,现在我们需要做的是在得到多个正确坐标后,进行正确的计算,这样我们才能实现滑动这样炫酷的效果`(∩_∩)′)
首先我们需要建立一个概念
在Android的坐标系中,原点在屏幕左上角,向右x为正,向下y为正。
(为了好计算,图片中的坐标单位是px)
(下面就以这个为例,我们要将View从原点移动到(200,400)的位置,即B点与C点重合)
想实现View移动大致有这几种方式(代码见下面)
&?xml version="1.0" encoding="utf-8"?&
xmlns:android="/apk/res/android"
xmlns:tools="/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"&
android:id="@+id/ly"
android:background="#EFAA88"
android:layout_centerInParent="true"
android:layout_width="300px"
android:layout_height="500px"&
android:background="#aabbcc"
android:id="@+id/tv"
android:text="你好"
android:layout_width="100px"
android:layout_height="100px" /&
TestTextView也很简单,就是
* Created by Mr_immortalZ on .
* email : mr_
public class TestTextView extends TextView {
public TestTextView(Context context) {
super(context);
public TestTextView(Context context, AttributeSet attrs) {
super(context, attrs);
public TestTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
TranslateAnimation anim = new TranslateAnimation(0, 200, 0, 400);
anim.setFillAfter(true);
startAnimation(anim);
LogUtil.m("移动后 getX " + getX() + "
getY " + getY());
LogUtil.m("移动后 getLeft " + getLeft() + "tv getTop " + getTop()
+ " tv getRight " + getRight() + " tv getBottom " + getBottom());
return true;
我们移动到指定位置的有7种方式
layout(getLeft() + 200, getTop() + 400, getRight() + 200, getBottom() + 400);
移动后getLeft等值改变
2.offsetLeftAndRight、offsetTopAndBottom
offsetLeftAndRight(200);
offsetTopAndBottom(400);
移动后getLeft等值改变
3.修改LayoutParams
ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) getLayoutParams()
lp.leftMargin = getLeft() + 200
lp.topMargin = getTop() + 400
setLayoutParams(lp)
移动后getLeft等值不改变
4.scrollTo
((View)getParent()).scrollTo(-200,-400)
移动后getLeft等值不改变
5.scrollBy
((View)getParent()).scrollBy(-200,-400)
移动后getLeft等值不改变
对于scrollTo、scrollBy需要注意的有两个问题
移动计算值 =
最开始点坐标 - 最后移动到的坐标
原因是因为最终会调用这个方法
—— invalidateInternal(l - scrollX, t - scrollY, r - scrollX, b - scrollY, true, false);
其中l,t,r,b为原来坐标点,scrollX,scrollY为目标坐标点,只有当目标坐标点值是负数时,移动到的位置才为正数!
例如scrollTo ,我们要从(0,0)移动到(200,400)这个点,根据上面的公式可知为负值
为什么需要加上 ((View)getParent())
TestTextView本身是View,scrollTo、scrollBy移动的都是View的Content,如果不加的话,使用的效果则是TestTextView的文字位置变化,而TestTextView本身不会变化。
如果在ViewGroup中使用scrollTo、scrollBy,则移动的是ViewGroup中的View.我们这里需要让TestTextView移动,则需要先 ((View)getParent()),然后再((View)getParent()).scrollTo…
6.属性动画
我就以ObjectAnimator为例子
AnimatorSet set = new AnimatorSet();
set.playTogether(
ObjectAnimator.ofFloat(this, "translationX", 200),
ObjectAnimator.ofFloat(this,"translationY", 400)
set.start();
移动后getLeft等值不改变
7.位移动画
TranslateAnimation anim = new TranslateAnimation(0,200,0,400);
anim.setFillAfter(true);
startAnimation(anim);
移动后getLeft等值不改变
关于位移动画的补充点:
我们经常用这样的需求,要求一个popupwindow从屏幕底部弹出或者从屏幕顶部弹出。
这里的位移设置同样还是如此(原点在屏幕左上角,向右x为正,向下y为正)
这篇博文可以参考学习下,下面这张神图也是来自这篇博文(Android动画之translate(位移动画))
属性动画是真实改变View的位置的,虽然属性动画、位移动画的getLeft等没有改变,但是属性动画的getX、getY是改变了的,位移动画的getX、getY仍未改变!
最后再来回顾下这张图
坐标分析上面都分析完了,基本上涵盖了自定义View坐标计算、滑动、事件分发等常见场景的坐标问题,希望大家能从中得到收获。
水平很菜,有错误的地方欢迎指正,大家一起学习进步!
? 反正撸完这篇,我算是对于坐标系有了更深刻的认识,给自己点个赞~?
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:61356次
排名:千里之外
评论:166条
大三狗,痴呆男,渴望成为大牛的小菜鸟
有问题欢迎邮件
----------------------
欢迎follow me =.=
(1)(2)(3)(2)我俩分手快半个月了 原因是 他说处了一年 感情淡了 而且他报的青岛 九月就会去那里上大学 我开始也挽留过 但是不成功 后来我们就说好以后当好朋友了 他还是会打电话给我 还约我去帮他选手机 逛街 看电影 服务员对我态度不好他还帮我说她 还会哄我 我真的糊涂了 不知道他心里到底是怎么想的 大家帮我分析一下好吗
不要去管他现在对待你的态度,
怎么说,他都是一个提出分手的背叛者~
我不能说他心里没有你,
但,心里完全有你的人,会舍得放弃吗?
还要以感情淡了为理由?
我们都知道 爱情会越变越浓,
之所以变淡,
应该是另一方不愿意再投入了~
现在你身旁做的那些事,也仅仅想表达一下他对你的内疚之感~
请不要再对他抱有幻想了,拿得起放得下才是真理~~~~
其他答案(共10个回答)
不分手,我撞死自己!
为什么不能联系呢?
是因为他有新的女朋友了嘛?
那你只能逼着自己去忘记
但是我不提倡去找一个新男友
因为你现在找的任何人都只是个替代品
我不在乎他这个分数给谁,但是我还是要说下,就是有些新加入的朋友,觉得自己在这里有很自由的言论,就讲一些,叫***跳楼,***滚蛋,***去爬,之类的话,很不礼貌...
破裂的镜子能重圆吗?即使真的重圆,那么彼此之间真的没有留下裂缝吗?
他当时为什么不挽留?为什么不解释?为什么一个月才想到和好?
你真的能够忘掉这一段分手吗?...
艳艳,你好!
失恋的种类有很多,最惨的恐怕就是被甩。而把惨变得更惨的方法就是穷追不舍,企图力挽狂澜。黎明和乐基儿的分手闹剧传得沸沸扬扬。娱乐圈的事情永...
两个人的感情不要那么轻易的说分开```遇到这样的情况``我不主张你做最坏的打算`~看你上面的问题``我觉得可能是你过份的爱你的男朋友了``我自己``和我宿舍的一...
答: 你好医生我和男友同居时不小心怀孕什么药物打胎好啊
答: 心里烦恼如何消除?
人在世界上烦恼的事很多,譬如我们身体上有老病死的烦恼,心理上有贪嗔痴的烦恼,我们的烦恼真有如大海的深广、树林的茂密,起惑造业,流转生...
答: 先从网上找,再电话联系
答: 她都结婚的人了还管她那么多干什么?
吃点亏也是好事呀.你父母又活不过你姐姐.可能管她一辈子吗?儿女的事让他们自己解决.不要干预,会有依赖感的.
哎.中国父母...
大家还关注
确定举报此问题
举报原因(必选):
广告或垃圾信息
激进时政或意识形态话题
不雅词句或人身攻击
侵犯他人隐私
其它违法和不良信息
报告,这不是个问题
报告原因(必选):
这不是个问题
这个问题分类似乎错了
这个不是我熟悉的地区
相关问答:123456789101112131415| 阅读(59)
留存率作为关键指标之一,而很多互联网公司会对存留率进行非常深入的挖掘。那么常用的留存率展现形式有哪些?我将几种存留率常用的展现形式写下来,为各位的分析存留率提供一定的参考。
本篇将给大家介绍一下存留数据的分析,这里先理一理日活、存留、复购、流失这几个概念。
日活:每天活跃的用户量,这个相对好理解,但有一些公司不会关注活跃数量,只关注订单量分布以及下单用户量分布。
存留:注册后在一定时间内有登录行为,存留更关注的的是产品行为,对存留的影响一般是产品的体验、质量、核心功能等,对存留的分析的目的一般也是落地在产品上。通过对产品功能的调整、优化,来提高存留率。
复购:在一定时间内再次购买行为,复购更关注的是消费行为,对复购的影响一般是商品或服务的质量、售后体验、用户消费满意度等,对复购的分析也会落地到商品或服务上。
流失:根据公司关注的内容不同,对流失的定义也不同,关注存留的将一定时间内没有登陆行为的定义为流失,关注复购的将一定时间内没有消费的定位为流失。通过对存留情况的分析,也能从一定的角度反映流失情况,但是可以对流失进行更细致的分析。
有的公司只关注存留(不销售商品或服务的),有的只关注复购,也有同时关注两者的,两者的分析方法也有很多相同的地方。下面先介绍日活和存留。
在互联网行业,通过各个渠道或者活动把用()户吸引过来,但是过一段时间就会有用户流失走掉,当然也会有一部分用户留下来,留下来这部分用户就叫做存留用户。互联网行业的拉新成本现在都很高,要投入广告、投入时间,这些都是成本。如果用户还没有产生什么价值就流失了,那一定是亏了。相反,拉过来的用户,存留的时间越长,产生的价值也就越大,也才能弥补其他流失用户所产生的损失。因此(),提高用户的存留时间,也是提高公司收入,为公司创造更多价值的重要一环。
有些公司只()关注用户日活量(每天的活跃用户量),有时虽然看着也不少,但其中可能也隐藏着问题,日活用户包括新用户和存留的老用户,如果存留的老用户越来越少,由拉新过来的用户来掩盖了存留的问题,是公司成本的巨大浪费。短期来看,如果存留正常,这么好的拉新效果,本可以给公司带来更高的日活量;往长期看,拉新的难度系数和成本会随着时间而上涨的,如果没有好的存留,仅仅靠拉新难以长期维持一个健康的日活量,存留率的健康也是公司发展的根本要素之一。
通过分析用户的日活/存留,来帮助运营人员发现问题、监控数据,为调整策略提供数据支持,达到提高日活/存留的效果。
日活监控,观察用户活跃数据,分析日活健康度
观察存留规律,定位存留阶段,辅助市场活动、市场策略定位等
对比不同用户、产品功能的存留情况,分析产品价值、辅助产品调整
1.日活监控,观察用户活跃数据,分析日活健康度
这里说日活有些片面了,因为并不是所有的公司关注的都是日活,根据公司产品定位的不同,关注的活跃周期也会不同,游戏、知乎、叫车等可能会重点关注日活,但是例如旅游、租车、家装这种订单密集度不高的,会根据自身的情况关注周活或者月活。尽管分析的活跃周期不同,但是分析方法类似,下面就仅以日活来举例。
活跃用户一般可以分为以下三类:
有些公司可能不太关注回流(一定时间内没有登陆的用户再次登陆)这部分用户,我将它列出来,是认为了解回流用户的日活情况在一些场合中是有价值的,例如活动期间、发优惠券测试,是否会对流失用户的回流产生了作用。
上图中是用finereport做的堆积面积图,其面积大小为各类型用户数,堆积总高度为总活跃用户数。对于日活数据来说,相对理想的情况是老用户占比较高,为活跃用户主力,并且呈现逐步上升的趋势,代表产品对新用户的粘性较好,总体拉新存留大于流失用户。否则,要么是新用户的存留率过低,要么是老用户的流失率过高,都需要进行调整。(尤其是新用户活跃数量相对较高的情况,提升空间相对比较大)
上图中,可以看出在5月19日之前的日活平稳,老用户数占比也比较平稳,在19日之后老用户占比逐步升高,并且可以注意到在5月19日之后的几天内,回流用户是有一定程度的上升的。我们可以想象为,该产品在5月19日到22日之间举办了一些活动,或者是产品上进行了调整,拉动了流失用户的回流,并且提升了产品的粘性。
2.观察存留规律,定位存留阶段,辅助市场活动、市场策略定位等
存留规律分析应该分开对待,一部分高频小额订单(例如外卖)这种互联网公司,其分析模式类似于游戏、知乎、SasS平台,会以日为单位来分析存留。
如上图所示,这种用户登录频率较高的应用,可以通过上图分成三个阶段,过滤期、试探期、平稳期。刚开始接触一个应用的用户中,有大量的用户是质量不高的用户,不可避免的要经历一个存留率大幅下降的阶段,但这一阶段周期一般较短(我认为这一阶段可能更多的是应用筛选用户)。在这一阶段过去之后,用户会对应用进行详细的试探,是否让自己满意,这段期间也会有部分用户流失。最后留下的就是相对稳定的用户了。
可以通过对产品的调整,来提升各阶段的存留率,上图中5月3日的存留情况相比于4月13日的已经大幅好转。这种对比图有助于观察跟踪产品的调整效果。
一些以订单为盈利模式的互联网公司,如果也关注存留率的话,一般会将存留分析的时间周期拉大到周或者月,要让用户每天登陆花钱下单,是难为用户了。
上图可称之为手枪图,该图可以看出用户存留的整体情况,存留率有没有越来越高,产品粘性是否做的够好,通过上图可以看出一定的问题来。但要像日存留那样,找出用户存留的三个阶段是比较困难的,因为用户是否存留下来更多的取决于消费体验,并且消费体验周期过长,很难判断用户是否会再次消费。所以对于这种以订单为盈利模式的产品来说,从复购的角度分析更为合理。(下一篇进行介绍)
上面的表格也可以用在日存留,与日存留的折线图结合使用。
3.对比不同用户、产品功能的存留情况,分析产品价值、辅助产品调整
如上图所示,通过对比,发现使用了分享功能和收藏功能的用户的存留率相对较高。得到这样一个信息后,可以通过产品上的调整,来鼓励用户使用分享、收藏等功能,以此来提高用户的存留率。
这种对比可以是多种形式的,将功能选择换成用户分类、用户来源,可以从不同的角度来观察问题。例如,如果发现男性用户的存留率比女性用户低,那么一是可以提醒反思造成这种情况的原因是什么,或者是可以调整产品推广渠道,以吸引女用户主。
存留率是互联网公司非常关注的指标之一,而很多公司会对存留率进行非常深入的挖掘。上文提供几种存留率常用的展现形式,为分析存留率提供一定的参考。
作者:admin,来自:运营派
转载请注明来源:申永祥博客,(QQ/微信:)原文地址:原文地址:
声明:博客内容除标记原创字样以外内容,均来自网络转载,版权归原作者所有,如涉及版权问题请及时联系处理。
上一篇: 下一篇:
关于用户留存率的分析知识,你知道多少?相关文章阅读更多:&&
关于用户留存率的分析知识,你知道多少?精彩文章出错啦 - PMCAFF产品经理社区 中国第一产品经理人气组织::专注于研究互联网产品
PMCAFF目前不支持IE浏览器, 请用其它的浏览器打开PMCAFF, 如果是双核浏览器, 请选择极速模式

我要回帖

更多关于 我想知道它们的秘密 的文章

 

随机推荐