歌词字级同步——ProgressText

天天动听里的歌词是字级同步的,在Android中如何实现呢?首先它的字有一层不同颜色的描边,另一方面随着时间推进一种颜色会逐渐代替另一种颜色。

对于第一个问题把 TextView 中的 Paint 改成 getPaint().setStyle(Paint.Style.FILL_AND_STROKE) 是没有用的,因为使用的是和字体相同的颜色来描边。所以这里采用了一个笨办法,真是笨办法,但比用阴影、设置一大一小叠字要好:-)

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    setTextColor(strokeColor);
    getPaint().setStrokeWidth(strokeWidth);
    getPaint().setStyle(Paint.Style.STROKE);
    super.onDraw(canvas);
}

先把字画出来,然后用不同的颜色描下边就可以了。

对于第二个问题要使用到 BitmapShader ,它继承自 Shader,文档里这样描述的:

A subclass of Shader is installed in a Paint calling paint.setShader(shader). After that any object (other than a bitmap) that is drawn with that paint will get its color(s) from the shader.

Paint 绑定 Shader 后,用它画出来的东西颜色都是从 Shader 中来取,Shader 的大小可能比所要画的物体要小,就如铺地板一样,地板总比地面要小,所以 Shader 中引入三种铺砖模式:

  1. CLAMP——用Shader边上的颜色来画超出的范围,原地板是[l,M,r],铺出来是…[l][l][l,M,r][r][r]…
  2. REPEAT——按正常情况下重复,原地板是[L,R],铺出来是[L,R][L,R][L,R]…
  3. MIRROR——边镜像边重复,原地板是[L,R],铺出来是[L,R][R,L][L,R]…

这里设置一个2个像素的BitmapShader,左边和右边像素颜色不一样,设置x方向的铺砖模式为CLAMP,y方向的铺砖模式为REPEAT,然后移动 Shader ,移动可以通过设置 Matrix 实现:

shader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, 
                                  Shader.TileMode.REPEAT);
matrix.setTranslate(pixels, 0);//左右移动pixels
shader.setLocalMatrix(matrix);

最后在先画 Shader,然后去掉 Shader 给字描边:

@Override
protected void onDraw(Canvas canvas) {
    getPaint().setStyle(Paint.Style.FILL);
    getPaint().setShader(shader);
    super.onDraw(canvas);

    getPaint().setShader(null);
    setTextColor(strokeColor);
    getPaint().setStrokeWidth(strokeWidth);
    getPaint().setStyle(Paint.Style.STROKE);
    super.onDraw(canvas);
}

具体实现见https://github.com/withparadox2/ProgressText,首先添加dependencies。
在Layout里声明:

在头部添加:xmlns:custom="http://schemas.android.com/apk/res-auto"
<com.withparadox2.progresstext.ProgressText
    android:id="@+id/progress_text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textSize="50sp"
    custom:after_progress_color="@android:color/holo_purple"
    custom:before_progress_color="#FFFF00"
    custom:stroke_color="@android:color/black"
    custom:stroke_width="1px"/>

然后就可以设置进度了:

textView = (ProgressText) findViewById(R.id.progress_text);
textView.setText("绿岛小夜曲");
textView.setProgressBypercentage(0.68f);
//textView.setProgressBypixels(150);

效果如下:

GrayHours

An implementation of 10k-hours theory.

basic rules and ideas

  • The number of goals or plans you want to set up are is limited to only four. More is helpless!
  • Once a goal is written down, you can not rename it or remove it unless you delete the whole app and then reinstall.
  • You are not allowed to record more details than the time consumed for a goal.
  • Checking the github-view like graph everyday will force you to fill every blank day.

screenshots

source code

https://github.com/withparadox2/GrayHours

牵手

Tips:w(上)s(下)a(左)d(右)q(左上)e(右上)z(左下)c(右下)


寒冷的夏天


我醒来了,发现自己躺在图书馆前面的草坪中,旁边停着我的自行车,看看时间已经夜里一点半了,在这快睡了一小时。以前每次路过草坪时总会看见有人惬意的躺在上面,阳光浇洒在身上,展现出一种很享受的姿态,我在想终有一天我也要躺它一躺,今天终于实现了,却是在四年后的一个不见人影的深夜里。草坪完全不像它看上去的那般柔软,坚硬的草梗扎着背很难受,对此我有些失望,还是回去算了。

在入睡之前我是打算看月亮的,在滚滚的鳞片状的层云中 ,硕大的月亮时隐时现,我仰着脖子 看了好久,感觉太累就躺下了,之后便思绪万千胡乱瞎想起来。我是如此的年轻,却总感到老之将至,好像从身边悄悄溜走的不是现在,而是未来,未来她已经提前来了。月亮极美,有着诱人的魔力,但终究是不属于我的,我要她也没什么用呀,但她在我心中是如此的唯一,而我于她和那茫茫万千人毫无二致,毫无生机,我就这样重复着,单调的重复着,不是重复自己就是重复他人,而我却总是自以为是的活着。这样的夜,难免不让人想念生死。

起初我只是打算出来逛逛,因为从没有瞧过凌晨的学校,也没瞧过凌晨的湖。夜凉似水,我在路灯下没命的骑车,没有人,一个人也没有,这怎叫我不兴奋,我不总是渴望这样没人的世界吗?我路过可爱的湖,看着鱼儿在水中翻腾换气,长椅上躺着一位乞丐,他是每天都来吗?我在主楼前面的空地上转了又转,转了又转,突然感到一股莫名的寒意涌上心头,算来我已经有半年没出过校门了,我已经有四年没出过校门了,我已经有二十多年都没走出过自己的世界了,就这样悄悄的活着,死了也就死了,谁又会知道呢?这就是我的全部人生 !

后来,我又沿着操场穿过大礼堂绕过校医院,斑驳横生的树影让我感到如入幽境,然后路过图书馆接着转到大草坪直奔女生公寓,这么晚了还有人没睡哇,我挤过澡堂前的窄道,又从男生公寓沿着去食堂的路绕到了图书馆,于是就在图书馆前的草坪上躺下了。

本来打算在这草坪上过个夜,但依古人所言:乘兴而来,兴尽而返,所以,还是回去算了。

我的诗

在整理旧笔记时看到了一首写于2009年下半年的诗,那时正逢离别。诗写的很是幼稚,其实到现在我还是很幼稚。由于这首诗没有题目,不如破罐子破摔,给它一个“无题”。

无题

秋风吹起湖面的涟漪
这是忧伤的一季
昨夜星光下的别离
成为彼此遥远的回忆
你是否会告诉我
相聚在哪里
我也舍不得你
善良和忧伤的美丽
放心去追逐那梦想的天地
我的离去
终将会成为秘密
不要后悔
不要在意
我们一起看过花开的美丽

一朵湖

学校里盛开着一朵湖,湖里是一汪浑浊的绿水,湖很小,很不好看,离近了还会闻到一股股腥味,但这是我最后可以流浪的地方。如果没有这一朵湖,我不知道今天会糟糕成什么样子。我大一时的一个夜里还在这里看到过一只水怪,并将此事说给了很多人听,如今四年过去了,相信的同学恐怕没有吧。其实连我自己都不相信,你说这狭湖浅池之地人气如此旺盛,到了深更半夜还人山人海,鬼都不会来,何况高雅的水怪。

我和湖的关系很是奇怪,每到入夜天地暗淡无光时我便会摸出去找她幽会,坐在湖边亭子下的长椅上等着风将我们彼此连接。别看我们关系如此亲密,其实这都是我一厢情愿所造成的,毕竟湖从来都没说过喜欢我,或者说喜欢我来看她。要把这种情况放在现实中是万万无法成立的,比如我去向一只人类示好,我天天去接触他,结果发现他是个榆木疙瘩——不喜不悲,或者更直接点——他讨厌我,然后我就会很难受,感叹自己怎么会摊上这样一个薄命,最后只得悻悻离开。然而,然而面对可爱的湖,无论她是圣洁的还是肮脏的,只要我愿意便可以永远和她保证这种不离不弃的状态,我不会因为湖不喜欢我却无法表达出来而感到难过,我会很不要脸的冲着她喊一嗓子:不喜欢我你倒是说出来呀,掀掀浪给我瞧瞧。

在湖边,我只吹风。其实这是瞎说,湖边有风的日子是不多的,阳光倒是挺扎实,看到这,那些不道德人又要说我去找日了,算了,随你们便吧。一般来说,我白天很少出门,只因白天光线太强,能够揭发出我固有的全部缺点,让我毫无保留的赤裸在这天地之间。夜晚好呀,昏黄的灯光伴着朦胧的行月,一切都变得精巧起来,我可以展现出我曼妙的人形即便同时我揣着一张令人匪夷所思的面孔,谁又看得清呢?当然,我在赏花的时候还是得趁着白天去,夜晚只能是花赏我。我都记不清是在哪一年夏天湖里突然窜出几朵荷花,然后年年都来,我越想越奇怪,这破湖竟也能生花?不知道经过了多久的积蓄,为了封住我这种人的嘴,这朵湖在一个月黑风高的夜里谋定发力,要给世人一个惊喜,于是第二天便生出一堆娃儿来:水面清圆,一一风荷举。我只能说,有些湖注定是不安分的。自此,我没什么事时便会到湖边走一遭,去瞧瞧这些为我而开的圣莲,尽管没人会这么想。后来几年,荷花好似吃了药,如外来入侵生物一般席卷了半边湖,我在想,这厮这么猛,会不会哪天变个异然后进军旱地,长满整个学校,然后此校就变成荷花之校,进而诞生荷花之城,荷花之国,还有荷花之球…它们就是有这种为了生长而不择手段并吞噬一切的气势,也说不准是好是坏。

事实上,我要说每次去湖边都是看荷花那肯定是在瞎说,花有什么好看的,他们毫不知羞耻将一朵朵生殖器裸露在外,古人竟还为此发天地之叹:“可远观而不可亵玩焉”,人家那是用来干活的不是来给你们玩的。之所以不觉得荷花有什么好,只是因为熟悉的地方没有风景。由于一年中大部分时间是处于无荷状态,我到湖边就纯粹是来打发时间的,大江炼志,小湖怡情,学校这么小,不来这去哪儿?湖真好,泛着绿光的湖也好呀,我能透过它看到我不敢直视的太阳或者某个姑娘,在轻波中荡漾,在心里荡漾。另外,我白天还会在湖边看一些治愈系的书,我看看书然后再瞧瞧湖,书好,湖好,这一切真好,只有我不好。

荷花是景,有景必有人,在这学校呆过两年的同学都会知道荷花的疯狂,离别时必然会双双抱拳于胸,冲着满湖的生殖器感叹道:聚散苦匆匆,此恨无穷,今年花胜去年红,可惜明年花更好,知与谁同?

夜晚的湖和我一样,在光和影的觥筹中我们一下子帅气了许多,湖兄,不知你是否同意,这都是命呐。白天有花有人我到湖边还算正常,夜晚去那儿干什么呢?捉奸?捉水怪?不不不,水怪乃意外之物,捉奸非俗人所为。夜晚,月朗星稀,天上明灭着相互追赶的云片,我坐在湖边谛听,听湖声,听风语,一直听到所有的话都是自己说给自己听为止,那时便会发现城市的夜也不过如此。人们太过于钟情于自己与外界的联系,反而羁绊了所有的步伐,甚至有事没事便感到生不如死,事实上,当真用一些手段让你生不如死时你便会醒悟此刻你是多么的幸福呀。湖是一面涂黑的镜子,她什么也照不出来,但我却可以通过她看到自己不安分的心是如何在跳动着。

湖说:你全在胡说。

我讨厌人有七情六欲,宁愿和你一样做一件风中之物,长久的凝视,长久的不知疲惫,在懵懵懂懂中来,在懵懵懂懂中去。