ClownQiang的日常

爱Coding,爱吉他,爱生活

~2015~


最近刷知乎,早几天开始就已经满屏幕的2015总结等相关问题。相比过去,今年过的更加让我琢磨不透,还没等我好好喘口气,2016就过来了,是啊又过去了,而且我也快毕业了~ 

“生活不易”,这个大概是我2015最“痛”的回忆。从年初过来后的,满怀信心,随着时间一刀刀削掉我的棱角,到了年中,我似乎没有什么好骄傲的了。在海投简历之后,找到一份相对不错的实习,带着剩下的信心来到上海。以为时间会帮我调节一切,但是内心却越来越焦虑,以至于最难受时每天要死命的在大马路上骑车,直到自己疲惫不堪再回到家中。生活上的单调,加上本身心态波折,我第一次感觉自己这么的力不从心,我不断问自己“我到底需要的是什么”,或者是“我究竟为了什么要这样走下去”,或许二十几年一直没有答案的问题,现在反弹了。即使我让自己借助弹吉他,玩手工,骑车等活动改变心态,但是无济于事。

时间很快来到了十一月,我感觉自己似乎支撑不下去了,提前一个月,我提出了辞职。完后,我来到窗前,看着马路上忙碌的人,一段时间我感觉自己每天就这样走在几条线上,想到后面几年甚至一辈子都可能是这种生活,我就有点后怕。从未这样观察过其他人的生活,这种感觉很奇妙,大家都来来往往的走着,也不知道终点在哪里。

生活貌似好起来了一点,自己又开始收集乐趣了,迷茫期时爱上了摇滚,耳机总是动次打次,就喜欢那种不爽就吼出来;没事也会去书店看看书,当然漫画书也是有的。生活不经意间又添了一些颜色,或许人生很多东西就是“得而复失,失而复得”。

十二月,到了要离开上海的时候。大家吃了饭,说了些话,然后离开了。记得吃饭时,我说了一句“都是缘分!”,CEO也回了一句“都是缘分”。

回到学校,仿佛一切都是新的一样,心里一阵莫名的感动,一晃眼已经过去三年半。自己已经不像大一,可以几个室友冬天满学校找有空调的地方学习;也不像大二,可以和一群人围在显示器前讨论如何给大一学弟上课;也不像大三,可以说着“我还有一年”。我能做的也只有一边怀念过去,一边继续解答心里的问号,或许未来会更好。

最后想起在上海的某个下午,天气很好,阳光不骄不躁,我推着车上了轮渡,对面的高楼映着阳光,我靠在车上,懒懒的看着那楼,耳机里放着的是《钟鼓楼》,唱的正是那句“是谁出的题这么的难,到处全都是正确答案”。

生活的馈赠(三)

今天是11月16日,下着小雨,明天郑凯同时就要走了。 好长时间不看《一席》了,翻出来看到一个新视频顶的很高,叫《追求自由的亡命徒》,一个老爷爷,王德顺,79岁。演讲看的我的身子一震,发现自己还是那么懦弱,最后白桦的诗《船》,犹如一颗流星砸在我身上。记下来,算是我这段麻木时光的一个印记。

《船》白桦
我有过多次这样的奇遇,
从天堂到地狱只在瞬息之间;
每一朵可爱、温柔的浪花,
都成了突然崛起、随即倾倒的高山。

每一滴海水都变脸变色,
刚刚还是那样美丽、蔚蓝;
旋涡纠缠着旋涡,
我被抛向高空又投进深渊……

当时我甚至想到过轻生,
眼前一片苦海无边;
放弃了希望就象放弃了舵柄,
在暴力之下只能沉默和哀叹。

今天我才有资格嘲笑昨天的自己,
为昨天落叶似的惶恐感到羞惭;
虚度了多少年华,
船身多次被礁石撞穿……

千万次在大洋里撒网,
才捕获到一点点生活的经验,
才恍然大悟,
啊!道理原是如此浅显:

你要航行吗?
必然会有千妖百怪出来阻拦;
暴虐的欺凌是它们的游戏,
制造灭亡是它们唯一的才干。

命中注定我要常常和它们相逢,
因为我的名字叫做船;
面对强大于自身千万倍的对手,
能援救自己的只有清醒和勇敢。

恐惧只能使自己盲目,
盲目只能夸大魔鬼的狰狞嘴脸;
也许我的样子比它们更可怕,
当我以生命相拼,一往无前!

只要我还有一根完整的龙骨,
绝不驶进避风的港湾;
把生命放在征途上,
让勇敢来决定道路的宽窄、长短。

我完完全全的自由了,
船头成为埋葬它们的铁铲;
我在波浪中有节奏地跳跃,
就象荡着一个巨大的秋千。

即使它们终于把我撕碎,
变成一些残破的木片;
我不会沉沦,决不!
我还会在浪尖上飞旋。

后来者还会在残片上认出我,
未来的诗人会喟然长叹:
“这里有一个幸福的灵魂,
它曾经是一艘前进着的航船……”

偶遇惊天大Bug


这段时间开始尝试使用okhttp,然而不是很顺利遇到了问题,之前一直吧返回来的Response直接在主线程进行解析response.body.string,就这样一个简单的操作一直折腾了我半天,后来在stackoverflow上面才发现原来,这个东西居然是有网络请求的,卧槽,卧槽,卧槽,重要的事情说三遍~~~

生活的馈赠(二)

还有什么能比这更好的么,我是说你在年轻的时候想做一件事情,然后你一往无前的去做了,收获了一个满心欢喜的结尾。 (来自豆瓣M_M_TiGeRLinG)

ActionBar中Menu隐藏后Item无法显示Icon


官方中ActionBar如果你隐藏了Menu Item,默认是不会显示Icon。虽然官方不支持,但是有时会使用到相关的效果,所以经过无数次的Google,终于找到了需要的方法和信息。

这个是在CSDN中guolin博主发现的方法,是利用反射来完成的,具体博客地址在这里

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Override  
public boolean onMenuOpened(int featureId, Menu menu) {  
    if (featureId == Window.FEATURE_ACTION_BAR && menu != null) {  
        if (menu.getClass().getSimpleName().equals("MenuBuilder")) {  
            try {  
                Method m = menu.getClass().getDeclaredMethod("setOptionalIconsVisible", Boolean.TYPE);  
                m.setAccessible(true);  
                m.invoke(menu, true);  
            } catch (Exception e) {  
            }  
        }  
    }  
    return super.onMenuOpened(featureId, menu);  

但是,但是,但是(重要的事情说三遍)如果你是使用的AppCompactActivity,这里的onMenuOpen可能就不会调用了,至少对于我是这样的

接下来我在stackoverflow上面发现另外的一种解决方法,同样是使用反射来达成效果,但是调用的地方不一样,如果你是用的是AppCompactActivity,可以使用下面的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Override
protected boolean onPrepareOptionsPanel(View view, Menu menu) {    
    if (menu != null) {       
        if (menu.getClass().getSimpleName().equals("MenuBuilder")) {                                       
            try{
                Method m = menu.getClass().getDeclaredMethod("setOptionalIconsVisible", Boolean.TYPE);                
                m.setAccessible(true);                
                m.invoke(menu, true);            
            } catch (Exception e) {                
            Log.e(getClass().getSimpleName(), "onMenuOpened...unable to set icons for overflow menu", e);           
            }
        }    
    } 
   return super.onPrepareOptionsPanel(view, menu);
}

写下来给那些踩到坑的人~~~

生活的馈赠(一)

有时自己生活突然失去了目标,我就喜欢在知乎里面看看别人是不是也会有相同的困惑,你也许会称这个为“心灵鸡汤”,可能吧,但是谁也不能否认它可能在某个瞬间给了你生活的一丝信心。

有时我会看到别人推荐的书,我便如获至宝,马上上豆瓣,多看上面看看有没有电子书卖,买下来,放在这里,久而久之,积累的书也就越来越多。或许有人说我这个只是心理上的一中安慰,但是生活不就是如此吗?我们总是在无聊之中给自己一些安慰,让我们相信有些东西还是值得我们去珍惜,值得我们去努力的。

“人生本来就是艰难的”,《少有人走过的路》里面这么说,一旦你真的接受了这一点,你就不会在抱怨生活,所有东西来的都是这么自然,你都可以去欣然接受。

生活的馈赠(序)

到了现在这个年龄,人总是喜欢胡思乱想,有时我都猜不透自己,总是想象自己到底需要什么样的生活,但是却不得而知。有时感觉生活给人最残忍的不是碌碌无为,而是给你对于未来的无限憧憬,但是在某一个瞬间突然将其打破。

有一次看《一席》中老树画画先生的演讲,他提到“中国人的哲学不是要他成为什么样的人,而是使其成为人”,听到这里我感到震撼。对于生活,每个人都有自己独特的生活方式,所以我有时会对于生活有些奇奇怪怪的想法,也许零零碎碎,也许不够全面,但是我想把他们整理起来,也许将来可以用的到。

这里开了一个新的文集,叫《生活的馈赠》,将这些想法整理起来,也许就是生活的礼物。

“何书还”之二(关于Animation使用)


官方介绍Animation使用

我看了一下官方文档,但是无奈我的理解能力不够好,跑了好多次还是看不见炫酷的动画效果,无奈只好去翻阅官方demo的源码,终于知道了怎么使用。

Touch Feedback(触摸反馈)

在XML文件中添加以下代码可以添加触摸反馈的动画效果(类似于涟漪的效果) – ?android:attr/selectableItemBackground(有边界,可以使用在listview的item上) – ?android:attr/selectableItemBackgroundBorderless(没有边界,或者直接看是看不到明显的边界,但是点击是有涟漪效果) 需要说明android:attr/selectableItemBackgroundBorderless是API 21新增加的

Circular Reveal

这个主要是提供一个圆形的显示或者隐藏的动画效果,主要使用的api是ViewAnimationUtils.createCircularReveal()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// previously invisible view
View myView = findViewById(R.id.my_view);

// get the center for the clipping circle
int cx = (myView.getLeft() + myView.getRight()) / 2;
int cy = (myView.getTop() + myView.getBottom()) / 2;

// get the final radius for the clipping circle
int finalRadius = Math.max(myView.getWidth(), myView.getHeight());

// create the animator for this view (the start radius is zero)
Animator anim =
    ViewAnimationUtils.createCircularReveal(myView, cx, cy, 0, finalRadius);

// make the view visible and start the animation
myView.setVisibility(View.VISIBLE);
anim.start();

里面几个参数的意思分别为: – myView 要展示动画效果的视图 – cx 动画开始的X坐标 – cy 动画开始的Y坐标 – startRadius 动画开始的角度 – finalRadius 动画结束的角度

Activity Transitions

关于这个我就不多写了,博主大苞米对于这个写的十分详细,给大家附上链接自己看一下,我就Activity之间的视图共享写一下,因为我在这个地方花了一些时间,所以记下来以备后面忘记。

首先需要在XML文件中你需要共享的View定义一个android:transitionName

1
2
3
4
5
6
7
<ImageView
                android:id="@+id/bookPage"
                android:layout_width="match_parent"
                android:layout_height="400dp"
                android:scaleType="centerCrop"
                android:tint="@color/photo_tint"
                android:transitionName="bookPage" />

然后可以定义动画效果:

1.可以在style文件中定义

1
2
3
<item name="android:windowContentTransitions">true</item>  
<item name="android:windowEnterTransition">@transition/explode</item>  
<item name="android:windowExitTransition">@transition/explode</item>

2.可以在java文件中定义

1
2
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);  
getWindow().setExitTransition(new Explode());  

然后在使用Intent跳转的时候,加入ActivityOptions

1
2
3
4
5
6
Intent intent = new Intent(this, Activity2.class);  
// shareView: 需要共享的视图  
// bookPage就是刚刚 transitionName所写的值
ActivityOptions options = ActivityOptions  
        .makeSceneTransitionAnimation(this, shareView, "bookPage");  
startActivity(intent, options.toBundle());

对于一次共享多个View的需要使用Pair.create(view,“shareName”),这里必须是View。

关于结束Activity时同样动画效果倒回可以使用Activity.finishAfterTransition()。

添加TranstionListener

同样你可以在进入动画时候添加动画监听器,这样你就可以在本页面加载更多的动画效果

1
2
3
4
5
6
7
8
9
10
11
12
13
getWindow().getEnterTransition().addListener(new TransitionAdapter() {
                @TargetApi(Build.VERSION_CODES.LOLLIPOP)
                @Override
                public void onTransitionEnd(Transition transition) {
                    ObjectAnimator color = ObjectAnimator.ofArgb(bookPage.getDrawable(), "tint",
                            getResources().getColor(R.color.photo_tint), 0);
                    color.start();
                    renewButton.animate().scaleX(1.0f);
                    renewButton.animate().scaleY(1.0f);
                    renewButton.animate().alpha(1.0f);
                    getWindow().getEnterTransition().removeListener(this);
                }
            });

关闭Activity时同样可以使用,需要重写onBackPressed()方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Override
    public void onBackPressed() {
        super.onBackPressed();
        if (Build.VERSION.SDK_INT == 21) {
            ObjectAnimator color = ObjectAnimator.ofArgb(bookPage.getDrawable(), "tint",
                    0, getResources().getColor(R.color.photo_tint));
            color.addListener(new AnimatorListenerAdapter() {
                @Override
                public void onAnimationEnd(Animator animation) {
                    finishAfterTransition();
                }
            });
            color.start();
            renewButton.animate().scaleX(0.0f);
            renewButton.animate().scaleY(0.0f);
            renewButton.animate().alpha(0.0f);
            finishAfterTransition();
        }
    }

“何书还”之一(Material Design小试)


很长一段时间没有写过文章了,这次赶上学校办的“手机应用开发大赛”,做了一个小小的App,带着尝试一下的心态,我选择了Google最新的Material Design,无奈能找到的资料太少,花了一段时间去网上淘各种资料,这里我就这个App做一下总结。

先上一些找到的资料:

Material Design官方介绍,英文和理解能力够好,直接看官方文档

博主Sam作为一个吃螃蟹的人,也做了一些对于Material Design的尝试,也写了一些文章,大家也可以去看看。

csdn博主大苞米同样也写了一些关于Material Design的文章

MaterialDesignCenter 这个整理的很完善,这里就不在分开上链接。

何书还 是我写的一个图书馆查询工具App,也尝试了Material Design

具体详细信息,大家可以上MaterialDesignCenter 中看看其他人时怎么做的。

AndroidStudio坑爹错误之一


前段时间被这个坑爹错误折腾了好长时间,废话不多说直接把它拉出来枪毙~~~~

错误信息

1
2
UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dx.cf.iface.ParseException: class name (com/companyname/UI/BuildConfig) does not match path (com/companyname/ui/BuildConfig.class) at 

解决方案

  • AndroidStudio clean项目,rebuild项目

你没有看错就是这么简单,但是你可能在logcat里面看到其他信息,比如这个:

1
UNEXPECTED TOP-LEVEL EXCEPTION

如果你将这个信息Google一下,就会发现,有各种各样的方案,比如说有重复编译jar包等等,我们不排除有这个可能。

所以如果碰上上面的问题,可以先clean,rebuild的尝试一下先~~~