Long Luo's Life Notes

每一天都是奇迹

By Long Luo

继第一篇 Android自定义View:如何实现一个模拟时钟? ,我们使用Android自定义View实现了一款模拟表盘,第二篇 Android自定义View:另一种实现手表指针转动的方法 ,我们又通过另外一种方法实现了手表指针的另外一种转动实现。

在日程生活中,我们常见的挂钟实际都是有个钟摆的,那么,如果我们想在我们所作的模拟时钟实现这种钟摆动画呢?那么具体应该如何实现呢?

一、钟摆

遇到问题,我们需要先分析钟摆动画的具体动画效果,然后再做下一步工作。

单摆是能够产生往复摆动的一种装置,将无重细杆或不可伸长的细柔绳一端悬于重力场内一定点,另一端固结一个重小球,就构成单摆

那么钟摆就是在一定角度内来回摆动,具体更多细节可以自行Google。

二、Android Animation分析

在这一节里,我们会简单谈谈Android动画。

2.1 动画分类

Android动画目前可分为以下3种:

2.1.1 补间动画(Tween Animation)

所谓的补间动画,其实就是定义了我们动画的起始点和终止点的状态,而动画的过程我们是不关心的,只需要达到我们想要的效果就行。

  1. 渐变动画支持四种类型:平移(Translate)、旋转(Rotate)、缩放(Scale)、不透明度(Alpha)
  2. 只是显示的位置变动,View的实际位置未改变,表现为View移动到其他地方,点击事件仍在原处才能响应
  3. 组合使用步骤较复杂。
  4. View Animation也是指此动画

对于补间动画来说,无论是用纯java代码构建Animation对象,还是通过xml文件定义Animation,其实最终的结果都是

1
2
3
4
Animation a = new AlphaAnimation();
Animation b = new ScaleAnimation();
Animation c = new RotateAnimation();
Animation d = new TranslateAnimation();

2.1.2 帧动画(Frame Animation)

所谓的帧动画就是可以设置我们的动画的每一帧的效果,其实视频或者Gif的效果都是由许多张图片在很短的时间内播放,从而产生动画效果。

  1. 用于生成连续的Gif效果图。
  2. DrawableAnimation也是指此动画。

2.1.3 属性动画(Property Animation)

属性动画是Android动画里面最复杂也是最能做出复杂的动画效果的一种类型。

  1. 支持对所有View能更新的属性的动画(需要属性的setXxx()和getXxx())。
  2. 更改的是View实际的属性,所以不会影响其在动画执行后所在位置的正常使用。
  3. Android3.0(API 11)及以后出现的功能,3.0之前的版本可使用github第三方开源库nineoldandroids.jar进行支持。

属性动画的相关的API:

  • ValueAnimator:值动画执行类,常配合AnimatorUpdateListener使用。
  • ObjectAnimator:对象动画执行类。
  • PropertyValuesHolder: 属性存储器,为两个执行类提供更新多个属性的功能。
  • AnimatorListener:动画执行监听,在动画开始、重复、结束、取消时进行回调。
  • Keyframe:为PropertyValuesHolder提供多个关键帧的操作值。
  • AnimatorSet:一组动画的执行集合类:设置执行的先后顺序,时间等。
  • TimeInterpolator:时间插值,用于控制动画执行过程。
  • AnimatorUpdateListener:动画更新监听。
  • TypeEvaluator:类型估值,用于设置复杂的动画操作属性的值。

ValueAnimator和ObjectAnimator是属性动画里面经常使用的对象类,ObjectAnimator是 ValueAnimator的子类。

当然Android属性动画是很复杂,达到熟练运用还需要深入研究,大家想了解可以去网上寻找相关知识学习。

阅读全文 »

By Long Luo

— 井中月 —

仿《繁星·春水》

1
2
3
4
5
6
7

水井啊

只要你的内心有哪怕那么一点点波澜

就不能拥有美丽的月亮了

*** Long Luo at 2016-8-22 23:24:49 @Shenzhen.***

整理 By Long Luo

这几天用了很长时间爬完了水木社区很热的一个帖子:我最大的错误在哪里(20年…略长)?,这个帖子比较有营养,尤其是很多回帖非常有价值,让我学到了很多东西。

昨晚花了一个多小时整理并收集了一些精彩回帖,激励自己,时常看看,吸取力量。

人生坎坷太多,需要提高逆商啊!

苦海泛起爱恨,在世间,难逃避命运!


首先改变一下心态,不要总将问题归结于自己,查找自己的问题。很多时候就是命运弄人,没遇到好人而已。

建议,

第一,过平淡生活,不投机,老实赚钱,不求暴富,不追求女神,娶老婆性格为先。不是每个人能暴富。美女也不是随便那个人承受得了的。

第二,前妻提的些具体问题,可酌情做些改变。不得不承认,出身会带来一些不适应现代城市生活的特质,可适当修正,但不能急。

第三,对自己宽容些,不要给自己太多责任。


前面的受的苦只能说出身不是我们自己能选择的, 事实上你的努力也给了你足够的回报了,你所说的各种选择错误,只是错过了最优的选择, 但是人生就如同股票,没有经过,谁知道选择的就是最优的呢?

也许读博和出国了你后来得到的工作并不一定如你所选择的,因为你工作的平台并不差,导致后来每况愈下是因为自己的性格,即使你博士出来,换一个可能更好点的平台,极大可能也是一样搞的每况愈下;

对于自己的能力,还是要有自知之明,既然不适合迎合苟且,那就淡然的活好自己,毕竟你已经将自己从最贫苦的农村生活中挣扎出来了,而且你也有能力赡养老人还有余力自主兄弟,对于自己来说,已经是成功了,不是没人都能成刘强东啊;

最大的失败还是最终没有抵住诱惑加杠杆炒股,远超出了你自己的承受能力。

如果你认为自己的生活就是注定要在沼泽地里前行的话,你现在就是跌倒一个坑里了,但是还好,这个坑还不至于淹死你啊。 如果性格的缺陷终究是改变不了的, 我觉得你只要调整好心态,坚持努力,终究还是能够上岸的,

从你的叙述上来说,你小孩跟着妈妈并不是很好的选择, 你的孩子还是值得你继续奋斗,为他提供一个过得去的生活环境;

而且说又说的准你就一定不会再遇到一个能够真心相待的女人呢


楼主有几个重要的问题:

  1. 器量不够,心态太低。驾驭不住肤白貌美的女人和较多的金钱、权力,有挑战性但有前景的职业机会等。弱势的人不会被同情,只会被歧视

  2. 缺少投资、婚恋、职场等专业的知识和眼界,这个要么靠他人指点,要么靠自己学习,一般来说学习能力强的人走了弯路最后也能重新走到正路上,大学毕业后,要学的东西还是很多的。

  3. 怨天尤人,高考也赖这赖那,婚姻也赖前妻,炒股夜赖前妻,赚了估计就不赖了。。。要想拥有好东西,最重要是自己配的上,自己才是最重要的因素。


看到这样的帖子,也忍不住出来回复一下

  1. 总结出的失败,其实不存在这么多,你总结这么多等于没有总结

    • 比如学业失败,我恰恰觉得还挺成功,自己考研成功,指导自己老婆考研成功,可以做mentor了
    • 比如投资失败,也不怪你,不是因为炒股,而是因为杠杆炒股,只有千分之几的人能够把握,而且体制上也存在问题,国家没有管控好,身边很多70后的中产阶级,财富都被洗劫了,你还年轻这算什么?
    • 比如工作失败,每个人倒过来看,都会错过一些机会,本质上还是价值观的问题,见第二条
  2. 如果说存在的失败,那我觉得还是自我剖析、反思、总结、沉淀的失败
    你说原生家庭的失败,我承认,但是自己后续要能跳出来看,逐步建立起自爱、自信 追求美好的东西(这个美好不是说美貌什么的,而是价值观比较好),经过自己后天学习,深度思考,逐步建立起自己的思想体系

  3. 反复思考第一、第二点,你过去的经历是宝贵的财富


  1. 不要把责任推到别人身上。所有的决定都是自己的,对错都自己扛。
  2. 总结一下自己的优势,看看怎么样勤奋努力,可以增加收入。
  3. 你的主要问题是自卑心过重。其实现在干脆一切都放下,好好找个奋斗方向。

去年我也亏了不少,是你的几倍。不过我之前赚的多,虽然元气大伤所以承受住了。

别的我们没有交集我给予不了你太多建议。

  1. 投机是个长期的工作,而且是门科学,(学习,实践,提高)无限循环下去直到你退出为止。
  2. 你这年龄把目光放到投机上很正常,但是记住投机是从别人手里抢钱的游戏,你要多问问自己,凭什么你能从别人手里抢到钱。

做好自己能做好的一切吧,别想太多了,lz其实已经靠知识改变命运了,从最穷的人变成了在成都买两套房,婚姻失败也不算大事,吃一堑长一智罢了。在成都年入10万不算差了,可能上进心较强,总跟身边更高的人比。

很多事都是命,做出的选择不好跟出身还有自己的资源有很大关系。

其实错误和问题lz自己已经发现了,以后怎么改变也是命。欠30万也不算大事,挺过这个坎儿,后面会逐渐再好起来。

股市就是个买卖,做生意讲的是生行莫入熟行莫出,输钱皆因赢钱起。想尝试新鲜的领域一定要控制成本,不知道怎么面对失败本身就是很大的风险。

阅读全文 »

By Long Luo

在上一篇 Android自定义View:如何实现一个模拟时钟? 中我们实现了一款模拟时钟。在上一篇中,我们使用了Canvas中的canvas.rotate()方法让坐标系旋转从而绘制出指针。

但是,其实我们也可以使用另外一种方法去实现指针绘制,这种更直观,更容易理解。

一. 绘制指针

要绘制指针,需要知道指针的起点和终点,而起点就是圆心,终点就需要根据指针的sincos值及圆心进行对应的计算。

1.1 弧度

要计算指针对应的 sincos 值,区别于上一篇的角度,这一篇我们使用弧度。具体弧度是什么以及角度弧度换算关系可自行Google。

下面我们给出对应指针弧度如何计算的,如下所示:

1
2
3
float secRot = mCalendar.get(Calendar.SECOND) / 30f * (float) Math.PI;
float minRot = mCalendar.get(Calendar.MINUTE) / 30f * (float) Math.PI;
float hrRot = (((mCalendar.get(Calendar.HOUR_OF_DAY) + (mCalendar.get(Calendar.MINUTE) / 60f))) / 6f) * (float) Math.PI;

1.2 绘制

知道对应指针的弧度之后,我们就很容易计算出对应的指针坐标了,那么绘制也变得简单了,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
float secLength = centerX - 60;
float minLength = centerX - 80;
float hrLength = centerX - 100;

float hrX = (float) Math.sin(hrRot) * hrLength;
float hrY = (float) -Math.cos(hrRot) * hrLength;
canvas.drawLine(centerX, centerY, centerX + hrX, centerY + hrY, paintHour);

float minX = (float) Math.sin(minRot) * minLength;
float minY = (float) -Math.cos(minRot) * minLength;
canvas.drawLine(centerX, centerY, centerX + minX, centerY + minY, paintMinute);

float secX = (float) Math.sin(secRot) * secLength;
float secY = (float) -Math.cos(secRot) * secLength;
canvas.drawLine(centerX, centerY, centerX + secX, centerY + secY, paintSecond);

1.3 小插曲

开发完成之后,发现了一个Bug,指针一直不动,打印Log发现对应的弧度一直不变,那么很明显就是时间没有刷新,在计算弧度前,设置为当前时间即可。

1
mCalendar.setTimeInMillis(System.currentTimeMillis());
阅读全文 »

HashMap is very useful when a counter is required.

1
2
3
4
5
6
7
8
HashMap<String, Integer> countMap = new HashMap<String , Integer>();

// ... a lot of a’s like the following
if (countMap.keySet().contains(a)) {
countMap.put(a, countMap.get(a) + 1);
} else {
countMap.put(a, 1);
}

loop through hashmap

1
2
3
4
5
6
7
8
9
10
Iterator it = mp.entrySet().iterator();
while (it.hasNext()) {
Map.Entry pairs = (Map.Entry) it.next();
System.out.println(pairs.getKey() + " = " + pairs.getValue());
}

Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
System.out.println("Key = " + entry.getKey() + " , Value = " + entry.getValue());
}

2 print hashmap

1
2
3
4
5
6
7
8
9
10
public static void printMap(Map mp) {
Iterator it = mp.entrySet().iterator();

while (it.hasNext()) {
Map.Entry pairs = (Map.Entry) it.next();

System.out.println(pairs.getKey() + " = " + pairs.getValue());
it.remove(); // avoids a Concurrent Modification Exception
}
}
阅读全文 »
0%