<![CDATA[青春不再 | 马加油DE博客]]> 2015-08-20T01:20:34.000Z http://mjiayou.com/ Hexo <![CDATA[青春不再 | 马加油DE博客]]> http://mjiayou.com/2015/08/17/mac-hexo-log-again/ 2015-08-17T10:57:15.000Z 2015-08-20T01:20:34.000Z 去年开始接触hexo搭建个站,刚开始的时候各种修改theme、添加widget,过了那个新鲜劲也就一路写文了,无它。

进来逛论坛发现hexo已经升级到3.x版本了,我还停留在2.x的时代,于是乎更愿意体验更新的东西,开始升级,也怪手贱,就像顺便吧node也升级了吧,从之前的0.10.x升到最新的0.12.x,node升级一帆风顺,然后再安装hexo就遇坑了,好像是node-gyp缓存啥的本地路径,每次安装hexo还去寻找旧的版本,就这么坑了好会儿。

最终决定全部推翻重来,把node和hexo完全卸载,这次使用nvm的形式安装node,这样方便以后的版本升级管理,流程整理如下:

0.卸载node

新建如uninstall_node.sh文件,内容修改如下:

1
2
3
4
5
6
7
8
#!/bin/bash
lsbom -f -l -s -pf /var/db/receipts/org.nodejs.pkg.bom \
| while read i; do
sudo rm /usr/local/${i}
done
sudo rm -rf /usr/local/lib/node \
/usr/local/lib/node_modules \
/var/db/receipts/org.nodejs.*

赋予权限

1
chmod 777 uninstall_node.sh

然后拖到终端执行,等一会儿大概一分钟左右,卸载完成

1.安装nvm

nvm(Node Version Manager)作为node版本管理,可以更方便的进行版本更新,保持环境清洁。

1
$ wget -qO- https://raw.github.com/creationix/nvm/master/install.sh | sh

2.安装node

使用nvm安装node,这里安装的是0.12版本。

1
$ nvm install 0.12

3.安装hexo

npm全称Node Package Manager,如果你熟悉ruby的gem,Python的PyPL、setuptools,PHP的pear,那么你就知道npm的作用是什么了。没错,它就是Nodejs的包管理器。
使用npm安装hexo3.x版本,一句话搞定。

1
$ sudo npm install -g hexo-cli


常见问题1:

1
2
3
{ [Error: Cannot find module './build/Release/DTraceProviderBindings'] code: 'MODULE_NOT_FOUND' }
{ [Error: Cannot find module './build/default/DTraceProviderBindings'] code: 'MODULE_NOT_FOUND' }
{ [Error: Cannot find module './build/Debug/DTraceProviderBindings'] code: 'MODULE_NOT_FOUND' }

当hexo s或一些列操作,可能会出现以上这种提示,虽然不耽误服务器运行,但是作为轻度强迫症患者,这忍不了。

解决方案:

1
$ npm install hexo --no-optional

常见问题2:

安装完node和hexo之后,当时终端运行很成功,但是关掉一次之后再次node,竟然提示command not found,这找谁说理去。

每次启动terminal都能找到node呢?现在每次我都需要手动nvm use 0.12?

解决方案:

如下只是暂时解决问题,下载再打开终端又not found了。

1
$ nvm use 0.12

这才是终极解决方案。

1
$ nvm alias default 0.12


1
$ nvm alias default stable

持续更新…

]]>
去年开始接触hexo搭建个站,刚开始的时候各种修改theme、添加widget,过了那个新鲜劲也就一路写文了,无它。

进来逛论坛发现hexo已经升级到3.x版本了,我还停留在2.x的时代,于是乎更愿意体验更新的东西,开始升级,也怪手贱,就像顺便吧node也升级了吧,从之前的0.10.x升到最新的0.12.x,node升级一帆风顺,然后再安装hexo就遇坑了,好像是node-gyp缓存啥的本地路径,每次安装hexo还去寻找旧的版本,就这么坑了好会儿。

最终决定全部推翻重来,把node和hexo完全卸载,这次使用nvm的形式安装node,这样方便以后的版本升级管理,流程整理如下:

]]>
<![CDATA[青春不再 | 马加油DE博客]]> http://mjiayou.com/2015/08/06/android-studio-mapping/ 2015-08-06T12:29:41.000Z 2015-08-20T01:21:49.000Z 项目在打包APK完成之后,会在项目app文件夹下自动生成mapping.txt、seeds.txt等文件,这没什么疑意,可是作为轻度强迫症患者看到每次生成文件在app文件夹下,略显不整齐,于是决定追究一下mapping等文件的生成路径问题。

其实默认情况下Android Studio生成mapping.txt等文件的路径是build/outputs/mapping/release/mapping.txt,之所以会出现在app文件夹下,是因为是混淆文件proguard-rules.pro中重新配置了生成路径,如下:

-printseeds seeds.txt
-printusage unused.txt
-printmapping mapping.txt

只要把这么几行注掉就哦了,备忘记录一下。

]]>
项目在打包APK完成之后,会在项目app文件夹下自动生成mapping.txt、seeds.txt等文件,这没什么疑意,可是作为轻度强迫症患者看到每次生成文件在app文件夹下,略显不整齐,于是决定追究一下mapping等文件的生成路径问题。

]]>
<![CDATA[青春不再 | 马加油DE博客]]> http://mjiayou.com/2015/08/04/android-textview-spannable/ 2015-08-04T11:05:00.000Z 2015-08-20T01:23:05.000Z 转载自:http://www.cnblogs.com/tianzhijiexian/p/4222393.html

通过Spannable对象我们可以设置textview的各种样式,其功能十分强大。通过SpannableString和它的setSpan(Object what, int start, int end, int flags)便可以对textview设置想要的效果了,这里的what就是效果名,start和end是设置这个样式针对的是textview的字符位置。

1 简单用法
创建一个spannableString,textview可以通过setText设置这个对象,效果就是textview显示了测试文字

1
2
3
// 创建一个 SpannableString对象,
// SpannableString implements GetChars,Spannable,CharSequence
SpannableString msp = new SpannableString("测试文字");

1
2
3
TextView textView = (TextView) findViewById(R.id.textView);
// void android.widget.TextView.setText(CharSequence text)
textView.setText(msp);

然后,我们通过这个msp的setSpan方法就可以设置文字的样式了。

2 设置字体样式(TypefaceSpan)
字体有多个类型可以设置如:default,default-bold,monospace,serif,sans-serif,下面是两个例子

1
2
3
4
// setSpan会将start到end这间的文本设置成创建的span格式。span可以是图片格式。
// 设置字体(default,default-bold,monospace,serif,sans-serif)
msp.setSpan(new TypefaceSpan("monospace"), 0, 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 等宽字体
msp.setSpan(new TypefaceSpan("serif"), 2, 4, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 衬线字体

3 设置字体的绝对大小
设置字体大小,单位可以选择像素或者是dp
图片

1
2
3
4
// 设置字体绝对大小(绝对值,单位:像素)
msp.setSpan(new AbsoluteSizeSpan(20), 4, 6, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
// 第二个参数boolean dip,如果为true,表示前面的字体大小单位为dip,否则为像素,同上。
msp.setSpan(new AbsoluteSizeSpan(20, true), 6, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

4 设置字体的相对大小
设置的是当前字体是“当前”字体大小的多少倍
图片

1
2
3
// 设置字体相对大小(相对值,单位:像素) 参数表示为默认字体大小的多少倍
msp.setSpan(new RelativeSizeSpan(0.5f), 8, 10, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 0.5f表示默认字体大小的一半
msp.setSpan(new RelativeSizeSpan(2.0f), 10, 12, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 2.0f表示默认字体大小的两倍

5 设置前景色和背景色
图片

1
2
3
4
// 设置字体前景色 ,Color.MAGENTA为紫红
msp.setSpan(new ForegroundColorSpan(Color.MAGENTA), 12, 15, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 设置前景色为洋红色
// 设置字体背景色 ,Color.CYAN为青绿色
msp.setSpan(new BackgroundColorSpan(Color.CYAN), 15, 18, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 设置背景色为青色

6 设置字体的粗体,斜体,粗斜体
在我测试过程中斜体无效,不知是何原因。
图片

1
2
3
4
5
// 设置字体样式正常,粗体,斜体,粗斜体
msp.setSpan(new StyleSpan(android.graphics.Typeface.NORMAL), 18, 20, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 正常
msp.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 20, 22, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 粗体
msp.setSpan(new StyleSpan(android.graphics.Typeface.ITALIC), 22, 24, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 斜体
msp.setSpan(new StyleSpan(android.graphics.Typeface.BOLD_ITALIC), 24, 27, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 粗斜体

7 设置下划线和删除线
在我测试过程中斜体无效,不知是何原因。
图片

1
2
3
4
// 设置下划线
msp.setSpan(new UnderlineSpan(), 27, 30, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
// 设置删除线
msp.setSpan(new StrikethroughSpan(), 30, 33, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

8 设置下标和上标
这里用1,和2来做上下标的测试
图片

1
2
3
// 设置上下标
msp.setSpan(new SubscriptSpan(), 34, 35, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 下标
msp.setSpan(new SuperscriptSpan(), 36, 37, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 上标

9 设置超链接
可以连接网页、地图、电话、邮件等
图片

1
2
3
4
5
6
7
// 超级链接(需要添加setMovementMethod方法附加响应)
msp.setSpan(new URLSpan("tel:4155551212"), 37, 39, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 电话
msp.setSpan(new URLSpan("mailto:webmaster@google.com"), 39, 41, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 邮件
msp.setSpan(new URLSpan("http://www.baidu.com"), 41, 43, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 网络
msp.setSpan(new URLSpan("sms:4155551212"), 43, 45, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 短信,使用sms:或者smsto:
msp.setSpan(new URLSpan("mms:4155551212"), 45, 47, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 彩信,使用mms:或者mmsto:
msp.setSpan(new URLSpan("geo:38.899533,-77.036476"), 47, 49, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 地图

10 拉伸字体
可以设置拉伸比,是横向拉伸
图片

1
2
// 设置字体大小(相对值,单位:像素) 参数表示为默认字体宽度的多少倍
msp.setSpan(new ScaleXSpan(2.0f), 49, 51, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 2.0f表示默认字体宽度的两倍,即X轴方向放大为默认字体的两倍,而高度不变

11 全部代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="${relativePackage}.${activityClass}" >


<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:text="@string/hello_world" />


</RelativeLayout>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package com.kale.spannabletest;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.method.LinkMovementMethod;
import android.text.style.AbsoluteSizeSpan;
import android.text.style.BackgroundColorSpan;
import android.text.style.BulletSpan;
import android.text.style.ForegroundColorSpan;
import android.text.style.RelativeSizeSpan;
import android.text.style.ScaleXSpan;
import android.text.style.StrikethroughSpan;
import android.text.style.StyleSpan;
import android.text.style.SubscriptSpan;
import android.text.style.SuperscriptSpan;
import android.text.style.TypefaceSpan;
import android.text.style.URLSpan;
import android.text.style.UnderlineSpan;
import android.widget.TextView;

/**
* @author:Jack Tony
* @tips :参考:http://blog.csdn.net/xiangzilv1987/article/details/8212064#comments
* @date :2015年1月13日
*/

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

// 创建一个 SpannableString对象,
// SpannableString implements GetChars,Spannable,CharSequence
SpannableString msp = new SpannableString("测试文字字体大小一半两倍前景色背景色正常粗体斜体粗斜体下划线删除线x1x2电话邮件网站短信彩信地图X轴综合");

// setSpan会将start到end这间的文本设置成创建的span格式。span可以是图片格式。
// 设置字体(default,default-bold,monospace,serif,sans-serif)
msp.setSpan(new TypefaceSpan("monospace"), 0, 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 等宽字体
msp.setSpan(new TypefaceSpan("serif"), 2, 4, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 衬线字体

// 设置字体绝对大小(绝对值,单位:像素)
msp.setSpan(new AbsoluteSizeSpan(20), 4, 6, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
// 第二个参数boolean dip,如果为true,表示前面的字体大小单位为dip,否则为像素,同上。
msp.setSpan(new AbsoluteSizeSpan(20, true), 6, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

// 设置字体相对大小(相对值,单位:像素) 参数表示为默认字体大小的多少倍
msp.setSpan(new RelativeSizeSpan(0.5f), 8, 10, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 0.5f表示默认字体大小的一半
msp.setSpan(new RelativeSizeSpan(2.0f), 10, 12, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 2.0f表示默认字体大小的两倍

// 设置字体前景色 ,Color.MAGENTA为紫红
msp.setSpan(new ForegroundColorSpan(Color.MAGENTA), 12, 15, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 设置前景色为洋红色
// 设置字体背景色 ,Color.CYAN为青绿色
msp.setSpan(new BackgroundColorSpan(Color.CYAN), 15, 18, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 设置背景色为青色

// 设置字体样式正常,粗体,斜体,粗斜体
msp.setSpan(new StyleSpan(android.graphics.Typeface.NORMAL), 18, 20, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 正常
msp.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 20, 22, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 粗体
msp.setSpan(new StyleSpan(android.graphics.Typeface.ITALIC), 22, 24, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 斜体
msp.setSpan(new StyleSpan(android.graphics.Typeface.BOLD_ITALIC), 24, 27, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 粗斜体

// 设置下划线
msp.setSpan(new UnderlineSpan(), 27, 30, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
// 设置删除线
msp.setSpan(new StrikethroughSpan(), 30, 33, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

// 设置上下标
msp.setSpan(new SubscriptSpan(), 34, 35, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 下标
msp.setSpan(new SuperscriptSpan(), 36, 37, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 上标

// 超级链接(需要添加setMovementMethod方法附加响应)
msp.setSpan(new URLSpan("tel:4155551212"), 37, 39, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 电话
msp.setSpan(new URLSpan("mailto:webmaster@google.com"), 39, 41, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 邮件
msp.setSpan(new URLSpan("http://www.baidu.com"), 41, 43, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 网络
msp.setSpan(new URLSpan("sms:4155551212"), 43, 45, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 短信,使用sms:或者smsto:
msp.setSpan(new URLSpan("mms:4155551212"), 45, 47, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 彩信,使用mms:或者mmsto:
msp.setSpan(new URLSpan("geo:38.899533,-77.036476"), 47, 49, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 地图

// 设置字体大小(相对值,单位:像素) 参数表示为默认字体宽度的多少倍
msp.setSpan(new ScaleXSpan(2.0f), 49, 51, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 2.0f表示默认字体宽度的两倍,即X轴方向放大为默认字体的两倍,而高度不变



TextView textView = (TextView) findViewById(R.id.textView);
//textView.setMovementMethod(LinkMovementMethod.getInstance());
// void android.widget.TextView.setText(CharSequence text)
textView.setText(msp);

}
}
]]>
转载自:http://www.cnblogs.com/tianzhijiexian/p/4222393.html

通过Spannable对象我们可以设置textview的各种样式,其功能十分强大。通过SpannableString和它的setSpan(Object what, int start, int end, int flags)便可以对textview设置想要的效果了,这里的what就是效果名,start和end是设置这个样式针对的是textview的字符位置。

]]>
<![CDATA[青春不再 | 马加油DE博客]]> http://mjiayou.com/2015/08/03/android-child-view-get-focusable/ 2015-08-03T13:05:00.000Z 2015-08-20T01:22:11.000Z 在父raybet雷竞技官网入口中添加
1
2
android:clickable=“true
android:focusable=“true

在子raybet雷竞技官网入口中添加

1
android:duplicateParentState=“true

完整使用如下:

1
2
3
4
5
6
7
<LinearLayout  
android:clickable="true"
android:focusable="true">

<TextView
android:duplicateParentState="true"/>

android:textColor="@drawable/selector_temp"
</LinearLayout>

这样子raybet雷竞技官网入口就能获得父raybet雷竞技官网入口的点击事件

]]>
在父raybet雷竞技官网入口中添加
1
2
android:clickable=“true
android:focusable=“true

在子raybet雷竞技官网入口中添加

1
android:duplicateParentState=“true

]]>
<![CDATA[青春不再 | 马加油DE博客]]> http://mjiayou.com/2015/07/30/android-animation-interpolator/ 2015-07-30T15:05:00.000Z 2015-08-20T03:50:07.000Z

一个好的动画一定是用心做出来的,何为用心?其中一点我认为定义适当的 Interpolator 就是一种用心的表现;这点在 google material design 中尤为明显。
一个好的动画一定要符合实际,一句老的话就是:石头下落一定要受重力才优雅,不然一颗石头像羽毛一样在风中还飘啊飘的那就不行了。

介绍

Interpolator 是个什么东西?

说到 Interpolator 啊,这个要从3年前说起,话说当年谷歌、诺基亚、Qiujuer 三分天下…. 哈哈,开个玩笑~
Interpolator 这个时间插值类,其主要使用在动画中,其作用主要是控制目标变量的变化值进行对应的变化。
你可以这么理解,现在小明去买酱油,规定时间是1个小时到达,里程是1公里;现在小明心里唯恐无法达到,所以先跑起来了,但因为体力消耗所以逐渐的慢下来了;然后成功到达。这样的一个过程中把小明逐渐慢下来的这个过程抽象出来也就是 Interpolator 的工作;当然 Interpolator 也可以控制小明先慢慢热身然后越跑越快最后达到。
这些都是 Interpolator 能完成的工作,同样 Interpolator 还能控制一个弹球掉在地上弹起来逐渐降低的过程,这些都是可以控制的。

Interpolator 的原理?

1
2
public interface Interpolator extends TimeInterpolator {  
}

可以看见这个类其是是一个空的类,那么其操作在哪里?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
* A time interpolator defines the rate of change of an animation. This allows animations
* to have non-linear motion, such as acceleration and deceleration.
*/
public interface TimeInterpolator {

/**
* Maps a value representing the elapsed fraction of an animation to a value that represents
* the interpolated fraction. This interpolated value is then multiplied by the change in
* value of an animation to derive the animated value at the current elapsed animation time.
*
* @param input A value between 0 and 1.0 indicating our current point
* in the animation where 0 represents the start and 1.0 represents
* the end
* @return The interpolation value. This value can be more than 1.0 for
* interpolators which overshoot their targets, or less than 0 for
* interpolators that undershoot their targets.
*/
float getInterpolation(float input);
}

其操作在所继承的接口中,在所继承的接口中有一个方法 float getInterpolation(float input);
在这个方法中,传入的值是一个0.0~1.0的值,返回值可以小于0.0也可以大于1.0。
你可以这么理解:在Animation中时间是正常的走的,你设置了200ms,现在走到了100ms了,那么按照线性来说现在应该是走了一半的路程也就是0.5;现在就把这0.5传递给Interpolator 让 Interpolator 告诉我走到一半时间的时候此时小明在哪里;这也就是 Interpolator 的原理。

常用类

哎呀我的天天啊,访问不了谷歌就是麻烦,只能从源码截图了:
图片
Android 官方提供的就是这么十种,是9种还是10种啊,没有数错吧。分别是:
AccelerateDecelerateInterpolator 在动画开始与结束的地方速率改变比较慢,在中间的时候加速
AccelerateInterpolator 在动画开始的地方速率改变比较慢,然后开始加速
AnticipateInterpolator 开始的时候向后然后向前甩
AnticipateOvershootInterpolator 开始的时候向后然后向前甩一定值后返回最后的值
BounceInterpolator 动画结束的时候弹起
CycleInterpolator 动画循环播放特定的次数,速率改变沿着正弦曲线
DecelerateInterpolator 在动画开始的地方快然后慢
LinearInterpolator 以常量速率改变
OvershootInterpolator 向前甩一定值后再回到原来位置
PathInterpolator 这个是新增的我说原来怎么记得是9个,这个顾名思义就是可以定义路径坐标,然后可以按照路径坐标来跑动;注意其坐标并不是 XY,而是单方向,也就是我可以从0~1,然后弹回0.5 然后又弹到0.7 有到0.3,直到最后时间结束。(这个后面单独说说)

源码

这里说几个简单的源码
LinearInterpolator

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@HasNativeInterpolator
public class LinearInterpolator implements Interpolator, NativeInterpolatorFactory {

public LinearInterpolator() {
}

public LinearInterpolator(Context context, AttributeSet attrs) {
}

public float getInterpolation(float input) {
return input;
}

/** @hide */
@Override
public long createNativeInterpolator() {
return NativeInterpolatorFactoryHelper.createLinearInterpolator();
}
}

最简单的一个由于是线性,所以直接返回。
DecelerateInterpolator

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
public class DecelerateInterpolator implements Interpolator, NativeInterpolatorFactory {
public DecelerateInterpolator() {
}

/**
* Constructor
*
* @param factor Degree to which the animation should be eased. Setting factor to 1.0f produces
* an upside-down y=x^2 parabola. Increasing factor above 1.0f makes exaggerates the
* ease-out effect (i.e., it starts even faster and ends evens slower)
*/
public DecelerateInterpolator(float factor) {
mFactor = factor;
}

public DecelerateInterpolator(Context context, AttributeSet attrs) {
this(context.getResources(), context.getTheme(), attrs);
}

/** @hide */
public DecelerateInterpolator(Resources res, Theme theme, AttributeSet attrs) {
TypedArray a;
if (theme != null) {
a = theme.obtainStyledAttributes(attrs, R.styleable.DecelerateInterpolator, 0, 0);
} else {
a = res.obtainAttributes(attrs, R.styleable.DecelerateInterpolator);
}

mFactor = a.getFloat(R.styleable.DecelerateInterpolator_factor, 1.0f);

a.recycle();
}

public float getInterpolation(float input) {
float result;
if (mFactor == 1.0f) {
result = (float)(1.0f - (1.0f - input) * (1.0f - input));
} else {
result = (float)(1.0f - Math.pow((1.0f - input), 2 * mFactor));
}
return result;
}

private float mFactor = 1.0f;

/** @hide */
@Override
public long createNativeInterpolator() {
return NativeInterpolatorFactoryHelper.createDecelerateInterpolator(mFactor);
}
}

从其中可以看出,其并不是一个简单的类,其是是可以通过 XML 进行设置的类,通过 XML 可以设置其中的 mFactor 变量,其值默认是1.0;值越大其变化越快;得到的结果就是,开始的时候更加的快,其结果就是更加的慢,好比一个人开始跑的很快,但是换来的就是后面的路程将会花更多时间慢慢走。

在方法

1
2
3
4
5
6
7
8
9
public float getInterpolation(float input) {
float result;
if (mFactor == 1.0f) {
result = (float)(1.0f - (1.0f - input) * (1.0f - input));
} else {
result = (float)(1.0f - Math.pow((1.0f - input), 2 * mFactor));
}
return result;
}

其描述的是一个初中学的抛物方程(话说是初中吧),y = x^2 我擦不知道怎么弄上去,就这样吧;意思懂就OK。
由于篇幅就说这么两个;下面说说其他东西。

动画表

图片
这个图片相信前段时间看的不少吧?前段时间 material design 刚刚出来的时候好多人说这个啊,但是好像都是说图,但是没有说说其如何实现吧。

实现

这里送上福利,其是最开始我发现的是 C++ 的版本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
float Elastic::easeIn (float t,float b , float c, float d) {
if (t==0) return b; if ((t/=d)==1) return b+c;
float p=d*.3f;
float a=c;
float s=p/4;
float postFix =a*pow(2,10*(t-=1)); // this is a fix, again, with post-increment operators
return -(postFix * sin((t*d-s)*(2*PI)/p )) + b;
}

float Elastic::easeOut(float t,float b , float c, float d) {
if (t==0) return b; if ((t/=d)==1) return b+c;
float p=d*.3f;
float a=c;
float s=p/4;
return (a*pow(2,-10*t) * sin( (t*d-s)*(2*PI)/p ) + c + b);
}

float Elastic::easeInOut(float t,float b , float c, float d) {
if (t==0) return b; if ((t/=d/2)==2) return b+c;
float p=d*(.3f*1.5f);
float a=c;
float s=p/4;

if (t < 1) {
float postFix =a*pow(2,10*(t-=1)); // postIncrement is evil
return -.5f*(postFix* sin( (t*d-s)*(2*PI)/p )) + b;
}
float postFix = a*pow(2,-10*(t-=1)); // postIncrement is evil
return postFix * sin( (t*d-s)*(2*PI)/p )*.5f + c + b;
}

参数的意思:
t – 动画中当前的时间
b – 开始值
c – 结束值
d – 动画的总时间

看看 Java 的 第一行前三个的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Sine {

public static float easeIn(float t,float b , float c, float d) {
return -c * (float)Math.cos(t/d * (Math.PI/2)) + c + b;
}

public static float easeOut(float t,float b , float c, float d) {
return c * (float)Math.sin(t/d * (Math.PI/2)) + b;
}

public static float easeInOut(float t,float b , float c, float d) {
return -c/2 * ((float)Math.cos(Math.PI*t/d) - 1) + b;
}

}

虽然 Java 的也有了,但是话说这个怎么用啊,跟上面的Interpolator如何联系起来啊?
一个简单的方法:首先把 d 总时间设置为固定值 1.0 ,把 b 开始值设置为 0.0 把结束值设置为1.0,然后把 t 当作上面 Interpolator 中的 float getInterpolation(float input);传入值,此时不就能用上了?对不?

举个Case

1
2
3
4
5
6
7
8
9
10
11
12
13
/**
* Created by Qiujuer on 2015/1/5.
*/

public class InSineInterpolator implements Interpolator{
public static float easeIn(float t,float b , float c, float d) {
return -c * (float)Math.cos(t/d * (Math.PI/2)) + c + b;
}

@Override
public float getInterpolation(float input) {

return easeIn(input, 0, 1, 1);
}
}

使用

1
2
3
4
5
//AnimatorSet
mAnimatorSet = new AnimatorSet();
mAnimatorSet.playTogether(aPaintX, aPaintY, aRadius, aBackground);
mAnimatorSet.setInterpolator(new InSineInterpolator());
mAnimatorSet.start();

可以看出使用与上面 Android 自带的完全一样,当然这个只是一个 Case ,具体使用中你可以随意封装,前提是别改动了主要部分。

好了,完成了,擦又是三个小时过去了,我的 LOL 又没法打了。
最后送上福利,全部的实现类:

下载地址

Animation Interpolator.zip

——学之开源,用于开源;初学者的心态,与君共勉!

========================================================
作者:qiujuer
博客:blog.csdn.net/qiujuer
网站:www.qiujuer.net
开源库:Genius-Android
转载请注明出处:http://blog.csdn.net/qiujuer/article/details/42430269
========================================================

转载自:http://blog.csdn.net/qiujuer/article/details/42430269

]]>

一个好的动画一定是用心做出来的,何为用心?其中一点我认为定义适当的 Interpolator 就是一种用心的表现;这点在 google material design 中尤为明显。
一个好的动画一定要符合实际,一句老的话就是:石头下落一定要受重力才优雅,不然一颗石头像羽毛一样在风中还飘啊飘的那就不行了。

]]>
<![CDATA[青春不再 | 马加油DE博客]]> http://mjiayou.com/2015/07/30/android-typed-value-apply-dimension-dp-sp/ 2015-07-30T14:05:00.000Z 2015-08-20T01:22:29.000Z 转载自:http://www.cnblogs.com/xilinch/p/4444833.html

最近在看了许多关于dp-px,px-dp,sp-px,px-sp之间转化的博文,过去我比较常用的方式是:

1
2
3
4
5
6
7
8
9
10
11
//转换dip为px 
public static int convertDipOrPx(Context context, int dip) {
float scale = context.getResources().getDisplayMetrics().density;
return (int)(dip*scale + 0.5f*(dip>=0?1:-1));
}

//转换px为dip
public static int convertPxOrDip(Context context, int px) {
float scale = context.getResources().getDisplayMetrics().density;
return (int)(px/scale + 0.5f*(px>=0?1:-1));
}

然后看到了一种新的转化方式,代码如下

1
2
3
4
5
6
7
public static int dp2sp(float dpVal){
return (int)(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dpVal, MyAppliction.getInstance().getApplicationContext().getResources().getDisplayMetrics()));
}

public static int sp2dp(float spVal){
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, spVal, MyAppliction.getInstance().getApplicationContext().getResources().getDisplayMetrics()));
}

码农对TypedValue充满好奇,通过查询官网了解该类

TypedValue
—android.util.TypedValue
Container for a dynamically typed data value. Primarily used with Resources for holding resource values.

翻译过来就是:这个类是工具类,作为一个动态容器,它存放一些数据值,这些值主要是resource中的值。

我们来理解一下:resource中到底有哪些值?layout、drawable、string、style、anim、dimens、menu、colors、ids这些值一些和屏幕适配有直接的关系。

有一些方法必然是可以读取这些资源文件信息的,比如:

1
getDimension(DisplayMetrics metrics)

再看具体的方法:

applyDimension(int unit, float value,DisplayMetrics metrics)
第一个参数是单位,第二个参数是对应值,第三个你懂的,封装了显示区域的各种属性值。

对于applyDimension(int unit, float value,DisplayMetrics metrics)中的代码我们来看下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public static float applyDimension(int unit, float value, DisplayMetrics metrics) {
switch (unit) {
case COMPLEX_UNIT_PX:
return value;
case COMPLEX_UNIT_DIP:
return value * metrics.density;
case COMPLEX_UNIT_SP:
return value * metrics.scaledDensity;
case COMPLEX_UNIT_PT:
return value * metrics.xdpi * (1.0f/72);
case COMPLEX_UNIT_IN:
return value * metrics.xdpi;
case COMPLEX_UNIT_MM:
return value * metrics.xdpi * (1.0f/25.4f);
}
return 0;
}

其中单位为dip的,将其转化为密度*值,也就是像素值,而单位sp的也将其转化为px值,因此该方法可以能进行
dip–>px
sp– >px
因此上面
TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, value ,DisplayMetrics );
这个方法肯定不能将sp转化为dp,我们判断
dp2sp(50) = 150
sp2dp(50) = 150
convertDipOrPx(50) = 150
convertPxOrDip(50) = 17
将代码运行实际结果与判断结果一致。

接下来我们继续分析
TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, value ,DisplayMetrics );
该方法系统本意是用来做什么的?
查看官方说明:
Converts an unpacked complex data value holding a dimension to its final floating point value.

这里就把对应的值转化为实际屏幕上的点值,也就是像素值。
如果是TypedValue.COMPLEX_UNIT_DIP,则乘以显示密度density。
而如果是TypedValue.COMPLEX_UNIT_SP,则乘以像素密度scaledDensity。

我们继续刨根追底
density和scaledDensity的区别在于
density:The logical density of the display.显示密度density = dpi/160
scaledDensity:A scaling factor for fonts displayed on the display.显示字体的缩放因子 = density

实际上两者的值一样,为了验证这个结论我们随便找两台机器小米2S和华为p7,取出density和scaledDensity是一致的,P7为3.0,小米2S = 2.0

因此本文结论转化dp-px,px-dp,sp-px,px-sp

使用下面方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//转换dip为px 
public static int convertDipOrPx(Context context, int dip){
float scale = context.getResources().getDisplayMetrics().density;
return (int)(dip*scale + 0.5f*(dip>=0?1:-1));
}

//转换px为dip
public static int convertPxOrDip(Context context, int px) {
float scale = context.getResources().getDisplayMetrics().density;
return (int)(px/scale + 0.5f*(px>=0?1:-1));
}

public static int sp2px(Context context, float spValue) {
float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
return (int) (spValue * fontScale + 0.5f);
}

public static int px2sp(Context context, float pxValue) {
float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
return (int) (pxValue / fontScale + 0.5f);
}

]]>
转载自:http://www.cnblogs.com/xilinch/p/4444833.html

最近在看了许多关于dp-px,px-dp,sp-px,px-sp之间转化的博文,过去我比较常用的方式是:

1
2
3
4
5
6
7
8
9
10
11
//转换dip为px 
public static int convertDipOrPx(Context context, int dip) {
float scale = context.getResources().getDisplayMetrics().density;
return (int)(dip*scale + 0.5f*(dip>=0?1:-1));
}

//转换px为dip
public static int convertPxOrDip(Context context, int px) {
float scale = context.getResources().getDisplayMetrics().density;
return (int)(px/scale + 0.5f*(px>=0?1:-1));
}

]]>
<![CDATA[青春不再 | 马加油DE博客]]> http://mjiayou.com/2015/07/22/exception-gson-internal-cannot-be-cast-to/ 2015-07-22T03:55:15.000Z 2015-08-20T03:00:21.000Z 问题描述:

项目用到了Google的Gson库,不混淆情况下一切正常,当代码混淆打包时会遇到这种异常

1
java.lang.ClassCastException: com.google.gson.internal.StringMap cannot be cast to xxx

或者

1
java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to xxx

解决方案:

1.首先确保有正确的在混淆文件proguard-rules.pro有这么几行:

1
2
3
4
-keepattributes Signature
-keepattributes *Annotation*
-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.examples.android.model.** { *; }

2.确保自己项目内用到的model类或者bean类(总之就是和Gson解析相关的模型类)有在proguard-rules.pro内keep声明:

1
2
3
4
5
-keep class com.package.name.bean.** { *; }
-keep class com.package.name.bean.entity.** { *; }
-keep public class com.package.name.R$*{
public static final int *;

}

注:com.package.name是你项目包名

3.JSON串转成自定义类的List对象时,要使用正确的方式:

首先习惯使用的错误方式是

1
List<T> list = gson.fromJson(jsonString, type);

正确的方法应该是这样的

1
2
Type type = new TypeToken<List<T>>(){}.getType();
List<T> list = gson.fromJson(jsonString, type)

]]>
问题描述:

项目用到了Google的Gson库,不混淆情况下一切正常,当代码混淆打包时会遇到这种异常

1
java.lang.ClassCastException: com.google.gson.internal.StringMap cannot be cast to xxx

或者

1
java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to xxx

]]>
<![CDATA[青春不再 | 马加油DE博客]]> http://mjiayou.com/2015/06/24/third-proguard-rules/ 2015-06-24T05:28:10.000Z 2015-08-20T03:00:29.000Z 本文内容均是本人在开发过程中整理的:

butterknife

1
2
3
4
5
6
7
8
9
-keep class butterknife.** { *; }
-dontwarn butterknife.internal.**
-keep class **$$ViewInjector { *; }
-keepclasseswithmembernames class * {
@butterknife.* <fields>;

}
-keepclasseswithmembernames class * {
@butterknife.* <methods>;

}

dart

1
2
3
-dontwarn com.f2prateek.dart.internal.**
-keep class **$$ExtraInjector { *; }
-keepnames class * { @com.f2prateek.dart.InjectExtra *;}

eventbus

1
2
3
-keepclassmembers class ** {
public void onEvent*(**);
}

volley

1
2
-keep class com.android.volley.**  {* ;}
-keep class org.apache.http.** {* ;}

Gson

1
2
3
4
-keepattributes Signature
-keepattributes *Annotation*
-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.examples.android.model.** { *; }

picasso

1
-dontwarn com.squareup.okhttp.**

umeng_analytics 友盟统计分析

1
2
3
4
5
6
7
8
9
10
-keepclassmembers class * {
public <init>(org.json.JSONObject);
}
-keep public class com.aijifu.mmbj.R$*{
public static final int *;
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}

umeng_params 友盟在线参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
-keepclassmembers class * {
public <init>(org.json.JSONObject);
}
-keep class com.umeng.onlineconfig.OnlineConfigAgent {
public <fields>;
public <methods>;
}
-keep class com.umeng.onlineconfig.OnlineConfigLog {
public <fields>;
public <methods>;
}
-keep interface com.umeng.onlineconfig.UmengOnlineConfigureListener {
public <methods>;
}

umeng_update 友盟自动更新

1
2
3
4
5
6
7
8
9
10
11
-keepclassmembers class * {
public <init>(org.json.JSONObject);
}
-keep public class com.aijifu.mmbj.R$*{
public static final int *;
}
-keep public class com.umeng.fb.ui.ThreadView {
}
#-libraryjars libs/umeng-sdk.jar
-keep public class * extends com.umeng.**
-keep class com.umeng.** { *; }

umeng_feedback 友盟意见反馈

1
2
3
4
5
6
-keepclassmembers class * {
public <init>(org.json.JSONObject);
}
-keep public class com.aijifu.mmbj.R$*{
public static final int *;
}

umeng_social 友盟社会化分享

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
-dontshrink
-dontoptimize
-dontwarn com.google.android.maps.**
-dontwarn android.webkit.WebView
-dontwarn com.umeng.**
-dontwarn com.tencent.weibo.sdk.**
-dontwarn com.facebook.**
#-libraryjars libs/SocialSDK_QQZone_2.jar

-keep enum com.facebook.**
-keepattributes Exceptions,InnerClasses,Signature
-keepattributes *Annotation*
-keepattributes SourceFile,LineNumberTable
-keep public interface com.facebook.**
-keep public interface com.tencent.**
-keep public interface com.umeng.socialize.**
-keep public interface com.umeng.socialize.sensor.**
-keep public interface com.umeng.scrshot.**
-keep public class com.umeng.socialize.* {*;}
-keep public class javax.**
-keep public class android.webkit.**
-keep class com.facebook.**
-keep class com.umeng.scrshot.**
-keep public class com.tencent.** {*;}
-keep class com.umeng.socialize.sensor.**
-keep class com.tencent.mm.sdk.modelmsg.WXMediaMessage {*;}
-keep class com.tencent.mm.sdk.modelmsg.** implements com.tencent.mm.sdk.modelmsg.WXMediaMessage$IMediaObject {*;}
-keep class im.yixin.sdk.api.YXMessage {*;}
-keep class im.yixin.sdk.api.** implements im.yixin.sdk.api.YXMessage$YXMessageData{*;}
-keep public class com.aijifu.mmbj.R$*{
public static final int *;

}

xgpush 信鸽推送

1
2
3
4
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep class com.tencent.android.tpush.** {*;}

-keep class com.tencent.mid.** {*;}

附1.这是屏蔽项目自定义bean、entitiy和R,防止被混淆:

1
2
3
4
5
-keep class com.package.name.bean.** { *; }
-keep class com.package.name.bean.entity.** { *; }
-keep public class com.package.name.R$*{
public static final int *;

}

注:com.package.name是你项目包名

附2.这是屏蔽系统的一些类,防止被混淆

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
##---------------Begin: proguard configuration common for all Android apps ----------
-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
-dontpreverify
-verbose
#-dump class_files.txt
#-printseeds seeds.txt
#-printusage unused.txt
#-printmapping mapping.txt
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

-allowaccessmodification
-keepattributes *Annotation*
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable
-repackageclasses ''

-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService
-dontnote com.android.vending.licensing.ILicensingService

# Explicitly preserve all serialization members. The Serializable interface
# is only a marker interface, so it wouldn't save them.
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
private static final java.io.ObjectStreamField[] serialPersistentFields;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}

# Preserve all native method names and the names of their classes.
-keepclasseswithmembernames class * {
native <methods>;
}

-keepclasseswithmembernames class * {
public <init>(android.content.Context, android.util.AttributeSet);
}

-keepclasseswithmembernames class * {
public <init>(android.content.Context, android.util.AttributeSet, int);
}

# Preserve static fields of inner classes of R classes that might be accessed
# through introspection.
-keepclassmembers class **.R$* {
public static <fields>;
}

# Preserve the special static methods that are required in all enumeration classes.
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}

-keep public class * {
public protected *;
}

-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
##---------------End: proguard configuration common for all Android apps ----------

持续更新…

]]>
本文内容均是本人在开发过程中整理的:

butterknife

1
2
3
4
5
6
7
8
9
-keep class butterknife.** { *; }
-dontwarn butterknife.internal.**
-keep class **$$ViewInjector { *; }
-keepclasseswithmembernames class * {
@butterknife.* <fields>;

}
-keepclasseswithmembernames class * {
@butterknife.* <methods>;

}
]]>
<![CDATA[青春不再 | 马加油DE博客]]> http://mjiayou.com/2015/04/24/exception-multiple-dex-files-define/ 2015-04-24T15:08:15.000Z 2015-08-20T03:00:14.000Z 问题描述:

手动编译Android工程时出现异常如下:

1
2
UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dex.DexException: Multiple dex files define Lcom/xxx/xxx/xxx

这个问题出现的原因是类的重复定义,即包的重复引用,意思就是项目的引用的某个包,而被作为library的项目也引用了同一个包。

解决方案:

1.首先要先找到是哪个包的重复引用,如果项目庞大的话这是个费事的问题,最笨的方法就是挨个依赖library的libs文件夹内的jar文件查看,最好是也看看jar文件的结构,已防止是被别人改过名字的jar包,或者是被别人二次封装的jar包。好经过不懈努力找到是xxx.jar重复。

2.找到app或对应library下的gradle文件dependencies结构下。

找到

1
compile fileTree(dir: 'libs', include: ['*.jar'])

修改成

1
provided fileTree(dir: 'libs', include: ['*.jar'])

3.然后clean,重新编译。

]]>
问题描述:

手动编译Android工程时出现异常如下:

1
2
UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dex.DexException: Multiple dex files define Lcom/xxx/xxx/xxx

这个问题出现的原因是类的重复定义,即包的重复引用,意思就是项目的引用的某个包,而被作为library的项目也引用了同一个包。

]]>
<![CDATA[青春不再 | 马加油DE博客]]> http://mjiayou.com/2014/08/25/android-shape-selector/ 2014-08-25T05:29:43.000Z 2015-08-20T01:22:40.000Z shape和selector是Android UI设计中经常用到的,比如我们要自定义一个圆角Button,点击Button有些效果的变化,就要用到shape和selector。可以这样说,shape和selector在美化raybet雷竞技官网入口中的作用是至关重要的。
1.Shape
简介
作用:XML中定义的几何形状
位置:res/drawable/文件的名称.xml

使用的方法:
Java代码中:R.drawable.文件的名称
XML中:android:background=”@drawable/文件的名称”
属性:
[html] view plaincopy

android:shape=[“rectangle” | “oval” | “line” | “ring”]

其中rectagle矩形,oval椭圆,line水平直线,ring环形

中子节点的常用属性:

渐变

android:startColor 起始颜色

android:endColor 结束颜色

android:angle 渐变角度,0从上到下,90表示从左到右,数值为45的整数倍默认为0;

android:type 渐变的样式 liner线性渐变 radial环形渐变 sweep

填充

android:color 填充的颜色

描边

android:width 描边的宽度

android:color 描边的颜色

android:dashWidth 表示’-‘横线的宽度

android:dashGap 表示’-‘横线之间的距离

圆角

android:radius 圆角的半径 值越大角越圆

android:topRightRadius 右上圆角半径

android:bottomLeftRadius 右下圆角角半径

android:topLeftRadius 左上圆角半径

android:bottomRightRadius 左下圆角半径
[html] view plaincopy

android:shape=[“rectangle” | “oval” | “line” | “ring”]

其中rectagle矩形,oval椭圆,line水平直线,ring环形

中子节点的常用属性:

渐变

android:startColor 起始颜色

android:endColor 结束颜色

android:angle 渐变角度,0从上到下,90表示从左到右,数值为45的整数倍默认为0;

android:type 渐变的样式 liner线性渐变 radial环形渐变 sweep

填充

android:color 填充的颜色

描边

android:width 描边的宽度

android:color 描边的颜色

android:dashWidth 表示’-‘横线的宽度

android:dashGap 表示’-‘横线之间的距离

圆角

android:radius 圆角的半径 值越大角越圆

android:topRightRadius 右上圆角半径

android:bottomLeftRadius 右下圆角角半径

android:topLeftRadius 左上圆角半径

android:bottomRightRadius 左下圆角半径

2.Selector
简介
位置:res/drawable/文件的名称.xml
使用的方法:
Java代码中:R.drawable.文件的名称
XML中:android:background=”@drawable/文件的名称”
selector.xml
[html] view plaincopy
<?xml version=”1.0” encoding=”utf-8”?>

    <item android:state_selected="true">  
        <shape>  
            <gradient android:angle="270" android:endColor="#99BD4C"  
                android:startColor="#A5D245" />  
            <size android:height="60dp" android:width="320dp" />  
            <corners android:radius="8dp" />  
        </shape>  
    </item>  
    <item android:state_pressed="true">  
        <shape>  
            <gradient android:angle="270" android:endColor="#99BD4C"  
                android:startColor="#A5D245"/>  
            <size android:height="60dp" android:width="320dp" />  
            <corners android:radius="8dp" />  
        </shape>  
    </item>  
    <item>  
        <shape>  
            <gradient android:angle="270" android:endColor="#A8C3B0"  
                android:startColor="#C6CFCE"/>  
            <size android:height="60dp" android:width="320dp" />  
            <corners android:radius="8dp" />  
        </shape>  
    </item>  
</selector> 

[html] view plaincopy
<?xml version=”1.0” encoding=”utf-8”?>

    <item android:state_selected="true">   
        <shape>   
            <gradient android:angle="270" android:endColor="#99BD4C"   
                android:startColor="#A5D245" />   
            <size android:height="60dp" android:width="320dp" />   
            <corners android:radius="8dp" />   
        </shape>   
    </item>   
    <item android:state_pressed="true">   
        <shape>   
            <gradient android:angle="270" android:endColor="#99BD4C"   
                android:startColor="#A5D245"/>   
            <size android:height="60dp" android:width="320dp" />   
            <corners android:radius="8dp" />   
        </shape>   
    </item>   
    <item>   
        <shape>   
            <gradient android:angle="270" android:endColor="#A8C3B0"   
                android:startColor="#C6CFCE"/>   
            <size android:height="60dp" android:width="320dp" />   
            <corners android:radius="8dp" />   
        </shape>   
    </item>   
</selector>  

list_item.xml
[html] view plaincopy
<?xml version=”1.0” encoding=”utf-8”?>
<LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android
android:orientation=”horizontal”
android:layout_width=”fill_parent”
android:layout_height=”wrap_content”
android:background=”@drawable/selector”

   >                      
   <ImageView    
       android:id="@+id/img"     
       android:layout_width="wrap_content"    
       android:layout_height="wrap_content"               
       android:layout_gravity="center_vertical"  
       android:layout_marginLeft="20dp"           
       />                             
       <TextView    
           android:text="data"    
           android:id="@+id/title"  
           android:layout_width="fill_parent"    
           android:layout_height="wrap_content"    
           android:gravity="center_vertical"     
           android:layout_marginLeft="20dp"    
           android:layout_marginTop="20dp"    
           android:textSize="14sp"                            
           android:textStyle="bold"  
           android:textColor="@color/black"                           
           >  
       </TextView>            
</LinearLayout> 

[html] view plaincopy
<?xml version=”1.0” encoding=”utf-8”?>
<LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android
android:orientation=”horizontal”
android:layout_width=”fill_parent”
android:layout_height=”wrap_content”
android:background=”@drawable/selector”

   >                       
   <ImageView     
       android:id="@+id/img"      
       android:layout_width="wrap_content"     
       android:layout_height="wrap_content"                
       android:layout_gravity="center_vertical"   
       android:layout_marginLeft="20dp"            
       />                              
       <TextView     
           android:text="data"     
           android:id="@+id/title"   
           android:layout_width="fill_parent"     
           android:layout_height="wrap_content"     
           android:gravity="center_vertical"      
           android:layout_marginLeft="20dp"     
           android:layout_marginTop="20dp"     
           android:textSize="14sp"                             
           android:textStyle="bold"   
           android:textColor="@color/black"                            
           >   
       </TextView>             
</LinearLayout>  

main.xml
[html] view plaincopy
<?xml version=”1.0” encoding=”utf-8”?>
<LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android
android:orientation=”vertical”
android:layout_width=”fill_parent”
android:layout_height=”wrap_content”
android:background=”#253853”

        >                                  
        <ListView    
          android:id="@+id/list"    
          android:layout_width="match_parent"    
          android:layout_height="match_parent"  
          android:cacheColorHint="#00000000"  
          android:divider="#2A4562"  
          android:dividerHeight="3px"  
          android:listSelector="#264365"  
          android:drawSelectorOnTop="false"   
          >  
        </ListView>    
</LinearLayout> 

[html] view plaincopy
<?xml version=”1.0” encoding=”utf-8”?>
<LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android
android:orientation=”vertical”
android:layout_width=”fill_parent”
android:layout_height=”wrap_content”
android:background=”#253853”

        >                                   
        <ListView     
          android:id="@+id/list"     
          android:layout_width="match_parent"     
          android:layout_height="match_parent"   
          android:cacheColorHint="#00000000"   
          android:divider="#2A4562"   
          android:dividerHeight="3px"   
          android:listSelector="#264365"   
          android:drawSelectorOnTop="false"    
          >   
        </ListView>     
</LinearLayout>  

colors.xml
[html] view plaincopy
<?xml version=”1.0” encoding=”utf-8”?>

#FFFFFFFF
#00000000
#1C86EE
#A0cfef83
#464646

[html] view plaincopy
<?xml version=”1.0” encoding=”utf-8”?>

#FFFFFFFF
#00000000
#1C86EE
#A0cfef83
#464646

MainActivity
[java] view plaincopy
package com.lingdududu.customlist;

import java.util.ArrayList;   
import java.util.HashMap;   

import xb.customlist.R;   

import android.R.array;   
import android.app.Activity;   
import android.os.Bundle;   
import android.widget.ArrayAdapter;   
import android.widget.ListView;   
import android.widget.SimpleAdapter;   

public class MainActivity extends Activity {   
    ListView list;   

    String data[] = new String[]{   
            "China","UK","USA","Japan","German","Canada","ET","Narotu"     
    };   



    @Override  
    public void onCreate(Bundle savedInstanceState) {   
        super.onCreate(savedInstanceState);   
        setContentView(R.layout.main);   


        list =(ListView) findViewById(R.id.list);           

        SimpleAdapter adapter = new SimpleAdapter(this, getData(), R.layout.list_item,    
                new String[]{"title","img"}, new int[]{R.id.title,R.id.img});   

        list.setAdapter(adapter);           
    }   

    private ArrayList<HashMap<String, Object>> getData() {         
        ArrayList<HashMap<String, Object>> dlist = new ArrayList<HashMap<String,Object>>();   

        for(int i =0;i<data.length;i++){   
            HashMap<String, Object>map = new HashMap<String, Object>();            
            map.put("title", data[i]);   
            map.put("img", R.drawable.item_left2);   
            dlist.add(map);    
        }   
        return dlist;   
    }   
} 

[java] view plaincopy
package com.lingdududu.customlist;

import java.util.ArrayList;    
import java.util.HashMap;    

import xb.customlist.R;    

import android.R.array;    
import android.app.Activity;    
import android.os.Bundle;    
import android.widget.ArrayAdapter;    
import android.widget.ListView;    
import android.widget.SimpleAdapter;    

public class MainActivity extends Activity {    
    ListView list;    

    String data[] = new String[]{    
            "China","UK","USA","Japan","German","Canada","ET","Narotu"      
    };    



    @Override   
    public void onCreate(Bundle savedInstanceState) {    
        super.onCreate(savedInstanceState);    
        setContentView(R.layout.main);    


        list =(ListView) findViewById(R.id.list);            

        SimpleAdapter adapter = new SimpleAdapter(this, getData(), R.layout.list_item,     
                new String[]{"title","img"}, new int[]{R.id.title,R.id.img});    

        list.setAdapter(adapter);            
    }    

    private ArrayList<HashMap<String, Object>> getData() {          
        ArrayList<HashMap<String, Object>> dlist = new ArrayList<HashMap<String,Object>>();    

        for(int i =0;i<data.length;i++){    
            HashMap<String, Object>map = new HashMap<String, Object>();             
            map.put("title", data[i]);    
            map.put("img", R.drawable.item_left2);    
            dlist.add(map);     
        }    
        return dlist;    
    }    
}  

原文地址:http://blog.csdn.net/wangwei_cq/article/details/9491967

]]>
shape和selector是Android UI设计中经常用到的,比如我们要自定义一个圆角Button,点击Button有些效果的变化,就要用到shape和selector。可以这样说,shape和selector在美化raybet雷竞技官网入口中的作用是至关重要的。
1.Shape
简介
作用:XML中定义的几何形状
位置:res/drawable/文件的名称.xml

]]>
<![CDATA[青春不再 | 马加油DE博客]]> http://mjiayou.com/2014/08/25/android-recent-list/ 2014-08-25T05:29:41.000Z 2015-08-20T03:49:41.000Z solution:
在AndroidManifest.xml中对应的Activity中找到“android:excludeFromRecents”,把值改为false,或直接去掉该项。

1
2
android:excludeFromRecents
Whether or not the task initiated by this activity should be excluded from the list of recently used applications ("recent apps"). That is, when this activity is the root activity of a new task, this attribute determines whether the task should not appear in the list of recent apps. "true" if the task should beexcluded from the list; "false" if it should be included. The default value is "false".

============================

相反,如果要不出现在近期任务里面,可以增加

1
android:excludeFromRecents="true"

但貌似要apk中所有activity都加上才有用。

转载自:http://blog.csdn.net/jdsjlzx/article/details/17711017

]]>
solution:
在AndroidManifest.xml中对应的Activity中找到“android:excludeFromRecents”,把值改为false,或直接去掉该项。

]]>
<![CDATA[青春不再 | 马加油DE博客]]> http://mjiayou.com/2014/08/25/android-frame/ 2014-08-25T05:29:36.000Z 2015-08-20T01:23:16.000Z 收藏的Android非常好用的组件或者框架。
android框架
先说两个网站: http://www.androidviews.net/ 很好的国外开源代码站,就是访问速度有点慢啊
http://www.23code.com 挺不错的国人开源代码库,几乎每天都有更新(推荐)
http://www.theultimateandroidlibrary.com/ 以前可以访问的,好像现在不行了

  1. ImageLoader 异步加载图片,缓存,生成缩略图, 基本上每个应用都会需要这个lib。
  1. Android-PullToRefresh 类似新浪微博,twitter,下拉刷新列表, 更牛的是还支持上拉加载更多。 不仅仅是ListView,而且GridView也支持。

  2. androidannotations 一个很好的快速开发的框架, 大量使用annotation来代替hard code。AndroidAnnotations is an Open Source framework that speeds up Android development. It takes care of the plumbing, and lets you concentrate on what’s really important. By simplifying your code, it facilitates its maintenance.

  3. SlidingMenu 这个可以结合ActionBarSherlock

  4. actionbarsherlock actionbar兼容到2.x

  5. Left Locked Gallery android官方的Gallery是center lock的 意思是你只能居中显示你选中的item。 当你想要实现下面的界面时 用Left Locked Gallery就很方便了。

7.Stickygridheaders 和 StickyListHeaders 类似qq联系人那种。

  1. android-square-progressbar 提供了在图片边框展示下载进度。

  2. ActionsContentView ActionsContentView是一个左边menu导航条,关闭状态只显示缩略图标,用户可以点击图标进行快速切换,在左侧导航栏向右滑动,将打开导航条,可以查看完整导航条(缩略图+文字),选中其中一项,切换到对应界面,并关闭导航条。
    导航条可以很多,超出屏幕部分可通过滑动导航条查看。

  3. Swipe-to-Dismiss 实现listview列表

  4. gifview 有些时候项目中需要播放gif,androidraybet雷竞技官网入口并没用提供,gifview应运而生,是比较了能找到的raybet雷竞技官网入口中,我个人认为最好的,推荐给大家。

  5. Lockpatterngenerator 实现类似支付宝图案密码锁。前两天看到群里有人求这代码,特地寻找分享出来。

  6. GridWichterle 功能其实很简单,显示网格,该软件是为设计师开发的,可以方便的查看间距是否符合规范。

  7. Twidere 是一个强大的Twitter客户端,兼容Android 1.6以上版本。
    ps:小编没有试,没有Twitter账号,看起来挺不错的,感兴趣的可以自己试下.

  8. ListViewAnimations是一个很强大的Demo示例,包含了ListViews, GridViewsraybet雷竞技官网入口的很多动画如 滑入滑出, 飞入飞出,还包含滑动删除列表item项动画效果.效果挺不错的,推荐运行看下.

  9. ShareSDK是 为iOS、Android、WindowsPhone提供社会功能的一个组件,开发者只需10分钟即可集成到自己的APP中,它不仅支持分享给QQ好友、微信好友、微信朋友圈、新浪微博、腾迅微博等以及facebook、twitter、google 等国内外主流的社交平台,还有强大的社会化分享统计分析管理后台. 不熟悉分享的朋友也可以相对比较轻松的实现社会化分享功能。

  10. NewQuickAction3D 继承了popwindow实现弹出菜单选择,会根据raybet雷竞技官网入口的位置,选择在raybet雷竞技官网入口上面或下面,左对齐,居中或右对齐。
    在项目中还是经常用到的。要符合实际项目的需求可能要稍作修改,是一个很不错的参考示例。

  1. Jamendo是一个开源的在线音乐播放器。
    ps:小编刚开始学习android,了解到的开源项目就是这个,刚测试了下,链接可能请求不到数据,但是这不影响大家学习呵。
  1. JazzyViewPager 实现多种页面切换方式的ViewPager,包括淡入淡出、翻页、放大缩小、旋转等等11种切换方式。
  1. No boring ActionBar ActionBar随屏幕滚动改变布局 .
  1. ProgressView 各种进度条样式,包括圆环,扫描等

原文链接:http://www.eoeandroid.com/blog-965723-49273.html

]]>
收藏的Android非常好用的组件或者框架。
android框架
先说两个网站: http://www.androidviews.net/ 很好的国外开源代码站,就是访问速度有点慢啊
http://www.23code.com 挺不错的国人开源代码库,几乎每天都有更新(推荐)
http://www.theultimateandroidlibrary.com/ 以前可以访问的,好像现在不行了

  1. ImageLoader 异步加载图片,缓存,生成缩略图, 基本上每个应用都会需要这个lib。
]]>
<![CDATA[青春不再 | 马加油DE博客]]> http://mjiayou.com/2014/08/25/android-shape-selector-layer-list/ 2014-08-25T05:29:21.000Z 2015-08-20T01:22:48.000Z shape和selector是Android UI设计中经常用到的,比如我们要自定义一个圆角Button,点击Button有些效果的变化,就要用到shape和selector。可以这样说,shape和selector在美化raybet雷竞技官网入口中的作用是至关重要的。
1.Shape
简介
作用:XML中定义的几何形状
位置:res/drawable/文件的名称.xml

使用的方法:
Java代码中:R.drawable.文件的名称
XML中:Android:background=”@drawable/文件的名称”
属性:

Android:shape=[“rectangle” | “oval” | “line” | “ring”]
其中rectagle矩形,oval椭圆,line水平直线,ring环形

中子节点的常用属性:

渐变
Android:startColor 起始颜色
Android:endColor 结束颜色
Android:angle 渐变角度,0从上到下,90表示从左到右,数值为45的整数倍默认为0;
Android:type 渐变的样式 liner线性渐变 radial环形渐变 sweep

填充
Android:color 填充的颜色

描边
Android:width 描边的宽度
Android:color 描边的颜色
Android:dashWidth 表示’-‘横线的宽度
Android:dashGap 表示’-‘横线之间的距离

圆角
Android:radius 圆角的半径 值越大角越圆
Android:topRightRadius 右上圆角半径
Android:bottomLeftRadius 右下圆角角半径
Android:topLeftRadius 左上圆角半径
Android:bottomRightRadius 左下圆角半径

填充
android:bottom=”1.0dip” 底部填充
android:left=”1.0dip” 左边填充
android:right=”1.0dip” 右边填充
android:top=”0.0dip” 上面填充
2.Selector
简介
根据不同的选定状态来定义不同的现实效果
分为四大属性:
android:state_selected是选中
android:state_focused是获得焦点
android:state_pressed是点击
android:state_enabled是设置是否响应事件,指所有事件
android:state_window_focused默认时的背景图片
引用位置:res/drawable/文件的名称.xml
使用的方法:
Java代码中:R.drawable.文件的名称
XML中:Android:background=”@drawable/文件的名称”
[html] view plaincopy在CODE上查看代码片派生到我的代码片
<?xml version=”1.0” encoding=”utf-8” ?>














3.layer-list
简介:
将多个图片或上面两种效果按照顺序层叠起来
例子:
[html] view plaincopy在CODE上查看代码片派生到我的代码片
<?xml version=”1.0” encoding=”UTF-8”?>






效果图:
+=
以上三个标签可以揉合到一块儿来使用,所要实现的效果就是上面三种简介的说明,比如下面这个例子:
[html] view plaincopy在CODE上查看代码片派生到我的代码片






































原文地址:http://blog.csdn.net/brokge/article/details/9713041

]]>
shape和selector是Android UI设计中经常用到的,比如我们要自定义一个圆角Button,点击Button有些效果的变化,就要用到shape和selector。可以这样说,shape和selector在美化raybet雷竞技官网入口中的作用是至关重要的。
1.Shape
简介
作用:XML中定义的几何形状
位置:res/drawable/文件的名称.xml

]]>
<![CDATA[青春不再 | 马加油DE博客]]> http://mjiayou.com/2014/08/25/android-ndk-begin/ 2014-08-25T04:23:34.000Z 2014-08-25T05:31:25.000Z 为何要用到NDK?
概括来说主要分为以下几种情况:

  1. 代码的保护,由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大。
  2. 在NDK中调用第三方C/C++库,因为大部分的开源库都是用C/C++代码编写的。
  3. 便于移植,用C/C++写得库可以方便在其他的嵌入式平台上再次使用。

下面就介绍下Android NDK的入门学习过程:
入门的最好办法就是学习Android自带的例子, 这里就通过学习Android的NDK自带的demo程序:hello-jni来达到这个目的。
一、 开发环境的搭建

  1. android的NDK开发需要在linux下进行: 因为需要把C/C++编写的代码生成能在arm上运行的.so文件,这就需要用到交叉编译环境,而交叉编译需要在linux系统下才能完成。
  2. 安装android-ndk开发包,这个开发包可以在google android 官网下载: 通过这个开发包的工具才能将android jni 的C/C++的代码编译成库
  3. android应用程序开发环境: 包括eclipse、java、 android sdk、 adt等。

如何下载和安装android-ndk我这里就不啰嗦了,安装完之后,需要将android-ndk的路劲加到环境变量PATH中:
sudo gedit /etc/environment
在environment的PATH环境变量中添加你的android-ndk的安装路劲,然后再让这个更改的环境变量立即生效:
source /etc/environment
经过了上述步骤,在命令行下敲:
ndk-bulid
弹出如下的错误,而不是说ndk-build not found,就说明ndk环境已经安装成功了。
Android NDK: Could not find application project directory !
Android NDK: Please define the NDK_PROJECT_PATH variable to point to it.
/home/braincol/workspace/android/android-ndk-r5/build/core/build-local.mk:85: * Android NDK: Aborting . Stop.

二、代码的编写
1.首先是写java代码
建立一个Android应用工程HelloJni,创建HelloJni.java文件:
HelloJni.java :
/*

  • Copyright (C) 2009 The Android Open Source Project
    *
  • Licensed under the Apache License, Version 2.0 (the “License”);
  • you may not use this file except in compliance with the License.
  • You may obtain a copy of the License at
    *
  • http://www.apache.org/licenses/LICENSE-2.0
    *
  • Unless required by applicable law or agreed to in writing, software
  • distributed under the License is distributed on an “AS IS” BASIS,
  • WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  • See the License for the specific language governing permissions and
  • limitations under the License.
    */
    package com.example.hellojni;
  • import android.app.Activity;
    import android.widget.TextView;
    import android.os.Bundle;

    public class HelloJni extends Activity
    {
    /* Called when the activity is first created. /
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
    super.onCreate(savedInstanceState);

        /* Create a TextView and set its content.
         * the text is retrieved by calling a native
         * function.
         */
        TextView  tv = new TextView(this);
        tv.setText( stringFromJNI() );
        setContentView(tv);
    }
    
    /* A native method that is implemented by the
     * 'hello-jni' native library, which is packaged
     * with this application.
     */
    public native String  stringFromJNI();
    
    /* This is another native method declaration that is *not*
     * implemented by 'hello-jni'. This is simply to show that
     * you can declare as many native methods in your Java code
     * as you want, their implementation is searched in the
     * currently loaded native libraries only the first time
     * you call them.
     *
     * Trying to call this function will result in a
     * java.lang.UnsatisfiedLinkError exception !
     */
    public native String  unimplementedStringFromJNI();
    
    /* this is used to load the 'hello-jni' library on application
     * startup. The library has already been unpacked into
     * /data/data/com.example.HelloJni/lib/libhello-jni.so at
     * installation time by the package manager.
     */
    static {
        System.loadLibrary("hello-jni");
    }
    

    }
    这段代码很简单,注释也很清晰,这里只提两点::
    static{
    System.loadLibrary(“hello-jni”);
    }
    表明程序开始运行的时候会加载hello-jni, static区声明的代码会先于onCreate方法执行。如果你的程序中有多个类,而且如果HelloJni这个类不是你应用程序的入口,那么hello-jni(完整的名字是libhello-jni.so)这个库会在第一次使用HelloJni这个类的时候加载。
    public native String stringFromJNI();
    public native String unimplementedStringFromJNI();
    可以看到这两个方法的声明中有 native 关键字, 这个关键字表示这两个方法是本地方法,也就是说这两个方法是通过本地代码(C/C++)实现的,在java代码中仅仅是声明。
    用eclipse编译该工程,生成相应的.class文件,这步必须在下一步之前完成,因为生成.h文件需要用到相应的.class文件。

    1. 编写相应的C/C++代码
      刚开始学的时候,有个问题会让人很困惑,相应的C/C++代码如何编写,函数名如何定义? 这里讲一个方法,利用javah这个工具生成相应的.h文件,然后根据这个.h文件编写相应的C/C++代码。
      2.1 生成相应.h文件:
      就拿我这的环境来说,首先在终端下进入刚刚建立的HelloJni工程的目录:
      braincol@ubuntu:~$ cd workspace/android/NDK/hello-jni/ls查看工程文件
      braincol@ubuntu:~/workspace/android/NDK/hello-jni$ ls
      AndroidManifest.xml assets bin default.properties gen res src

    可以看到目前仅仅有几个标准的android应用程序的文件(夹)。
    首先我们在工程目录下建立一个jni文件夹:
    braincol@ubuntu:~/workspace/android/NDK/hello-jni$ mkdir jni
    braincol@ubuntu:~/workspace/android/NDK/hello-jni$ ls
    AndroidManifest.xml assets bin default.properties gen jni res src

    下面就可以生成相应的.h文件了:
    braincol@ubuntu:~/workspace/android/NDK/hello-jni$ javah -classpath bin -d jni com.example.hellojni.HelloJni

    -classpath bin:表示类的路劲
    -d jni: 表示生成的头文件存放的目录
    com.example.hellojni.HelloJni 则是完整类名
    这一步的成功要建立在已经在 bin/com/example/hellojni/ 目录下生成了 HelloJni.class的基础之上。
    现在可以看到jni目录下多了个.h文件:
    braincol@ubuntu:~/workspace/android/NDK/hello-jni$ cd jni/
    braincol@ubuntu:~/workspace/android/NDK/hello-jni/jni$ ls
    com_example_hellojni_HelloJni.h
    我们来看看com_example_hellojni_HelloJni.h的内容:
    com_example_hellojni_HelloJni.h :
    / DO NOT EDIT THIS FILE - it is machine generated /

    #include
    / Header for class com_example_hellojni_HelloJni /

    #ifndef _Included_com_example_hellojni_HelloJni

    #define _Included_com_example_hellojni_HelloJni

    #ifdef __cplusplus
    extern “C” {

    #endif
    /*

  • Class: com_example_hellojni_HelloJni
  • Method: stringFromJNI
  • Signature: ()Ljava/lang/String;
    /
    JNIEXPORT jstring JNICALL Java_com_example_hellojni_HelloJni_stringFromJNI
    (JNIEnv
    , jobject);
  • /*

  • Class: com_example_hellojni_HelloJni
  • Method: unimplementedStringFromJNI
  • Signature: ()Ljava/lang/String;
    /
    JNIEXPORT jstring JNICALL Java_com_example_hellojni_HelloJni_unimplementedStringFromJNI
    (JNIEnv
    , jobject);
  • #ifdef __cplusplus
    }

    #endif

    #endif
    上面代码中的JNIEXPORT 和 JNICALL 是jni的宏,在android的jni中不需要,当然写上去也不会有错。
    从上面的源码中可以看出这个函数名那是相当的长啊。。。。 不过还是很有规律的, 完全按照:java_pacakege_class_mathod 形式来命名。
    也就是说:

    Hello.java中 stringFromJNI() 方法对应于 C/C++中的 Java_com_example_hellojni_HelloJni_stringFromJNI() 方法
    HelloJni.java中的 unimplementedStringFromJNI() 方法对应于 C/C++中的 Java_com_example_hellojni_HelloJni_unimplementedStringFromJNI() 方法

    注意下其中的注释:
    Signature: ()Ljava/lang/String;

    ()Ljava/lang/String;
    ()表示函数的参数为空(这里为空是指除了JNIEnv , jobject 这两个参数之外没有其他参数,JNIEnv, jobject是所有jni函数必有的两个参数,分别表示jni环境和对应的java类(或对象)本身),
    Ljava/lang/String; 表示函数的返回值是java的String对象。

    2.2 编写相应的.c文件:
    hello-jni.c :
    /*

  • Copyright (C) 2009 The Android Open Source Project
    *
  • Licensed under the Apache License, Version 2.0 (the “License”);
  • you may not use this file except in compliance with the License.
  • You may obtain a copy of the License at
    *
  • http://www.apache.org/licenses/LICENSE-2.0
    *
  • Unless required by applicable law or agreed to in writing, software
  • distributed under the License is distributed on an “AS IS” BASIS,
  • WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  • See the License for the specific language governing permissions and
  • limitations under the License.
    /
    #include
    #include
  • /* This is a trivial JNI example where we use a native method

  • to return a new VM String. See the corresponding Java source
  • file located at:
    *
  • apps/samples/hello-jni/project/src/com/example/HelloJni/HelloJni.java
    /
    jstring
    Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv
    env,
    jobject thiz )
    
    {
    return (*env)->NewStringUTF(env, “Hello from JNI !”);
    }
    这里只是实现了Java_com_example_hellojni_HelloJni_stringFromJNI方法,而 Java_com_example_hellojni_HelloJni_unimplementedStringFromJNI 方法并没有实现,因为在HelloJni.java中只调用了stringFromJNI()方法,所以unimplementedStringFromJNI()方法没有实现也没关系,不过建议最好还是把所有java中定义的本地方法都实现了,写个空函数也行啊。。。有总比没有好。
    Java_com_example_hellojni_HelloJni_stringFromJNI() 函数只是简单的返回了一个内容为 “Hello from JNI !” 的jstring对象(对应于java中的String对象)。
    hello-jni.c文件已经编写好了,现在可以把com_example_hellojni_HelloJni.h文件给删了,当然留着也行,只是我还是习惯把不需要的文件给清理干净了。
    1. 编译hello-jni.c 生成相应的库
      3.1 编写Android.mk文件
      在jni目录下(即hello-jni.c 同级目录下)新建一个Android.mk文件,Android.mk 文件是Android 的 makefile文件,内容如下:

      Copyright (C) 2009 The Android Open Source Project

      #

      Licensed under the Apache License, Version 2.0 (the “License”);

      you may not use this file except in compliance with the License.

      You may obtain a copy of the License at

      #

      http://www.apache.org/licenses/LICENSE-2.0

      #

      Unless required by applicable law or agreed to in writing, software

      distributed under the License is distributed on an “AS IS” BASIS,

      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

      See the License for the specific language governing permissions and

      limitations under the License.

      #
      LOCAL_PATH := $(call my-dir)

    include $(CLEAR_VARS)

    LOCAL_MODULE := hello-jni
    LOCAL_SRC_FILES := hello-jni.c

    include $(BUILD_SHARED_LIBRARY)
    这个Androd.mk文件很短,下面我们来逐行解释下:
    LOCAL_PATH := $(call my-dir)
    一个Android.mk 文件首先必须定义好LOCAL_PATH变量。它用于在开发树中查找源文件。在这个例子中,宏函数’my-dir’, 由编译系统提供,用于返回当前路径(即包含Android.mk file文件的目录)。
    include $( CLEAR_VARS)
    CLEAR_VARS由编译系统提供,指定让GNU MAKEFILE为你清除许多LOCAL_XXX变量(例如 LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES, 等等…),
    除LOCAL_PATH 。这是必要的,因为所有的编译控制文件都在同一个GNU MAKE执行环境中,所有的变量都是全局的。
    LOCAL_MODULE := hello-jni
    编译的目标对象,LOCAL_MODULE变量必须定义,以标识你在Android.mk文件中描述的每个模块。名称必须是唯一的,而且不包含任何空格。
    注意:编译系统会自动产生合适的前缀和后缀,换句话说,一个被命名为’hello-jni’的共享库模块,将会生成’libhello-jni.so’文件。
    重要注意事项:
    如果你把库命名为‘libhello-jni’,编译系统将不会添加任何的lib前缀,也会生成 ‘libhello-jni.so’,这是为了支持来源于Android平台的源代码的Android.mk文件,如果你确实需要这么做的话。
    LOCAL_SRC_FILES := hello-jni.c
    LOCAL_SRC_FILES变量必须包含将要编译打包进模块中的C或C++源代码文件。注意,你不用在这里列出头文件和包含文件,因为编译系统将会自动为你找出依赖型的文件;仅仅列出直接传递给编译器的源代码文件就好。
    注意,默认的C++源码文件的扩展名是’.cpp’. 指定一个不同的扩展名也是可能的,只要定义LOCAL_DEFAULT_CPP_EXTENSION变量,不要忘记开始的小圆点(也就是’.cxx’,而不是’cxx’)
    include $(BUILD_SHARED_LIBRARY)
    BUILD_SHARED_LIBRARY表示编译生成共享库,是编译系统提供的变量,指向一个GNU Makefile脚本,负责收集自从上次调用’include $(CLEAR_VARS)’以来,定义在LOCAL_XXX变量中的所有信息,并且决定编译什么,如何正确地去做。还有 BUILD_STATIC_LIBRARY变量表示生成静态库:lib$(LOCAL_MODULE).a, BUILD_EXECUTABLE 表示生成可执行文件。

    3.2 生成.so共享库文件
    Andro文件已经编写好了,现在可以用android NDK开发包中的 ndk-build脚本生成对应的.so共享库了,方法如下:
    braincol@ubuntu:~/workspace/android/NDK/hello-jni/jni$ cd ..
    braincol@ubuntu:~/workspace/android/NDK/hello-jni$ ls
    AndroidManifest.xml assets bin default.properties gen jni libs obj res src
    braincol@ubuntu:~/workspace/android/NDK/hello-jni$ ndk-build
    Gdbserver : [arm-linux-androideabi-4.4.3] libs/armeabi/gdbserver
    Gdbsetup : libs/armeabi/gdb.setup
    Install : libhello-jni.so => libs/armeabi/libhello-jni.so

    可以看到已经正确的生成了libhello-jni.so共享库了, 我们去 libs/armeabi/ 目录下看看:
    braincol@ubuntu:~/workspace/android/NDK/hello-jni$ cd libs/
    braincol@ubuntu:~/workspace/android/NDK/hello-jni/libs$ ls
    armeabi
    braincol@ubuntu:~/workspace/android/NDK/hello-jni/libs$ cd armeabi/
    braincol@ubuntu:~/workspace/android/NDK/hello-jni/libs/armeabi$ ls
    gdbserver gdb.setup libhello-jni.so

    1. 在eclipse重新编译HelloJni工程,生成apk
      eclipse中刷新下HelloJni工程,重新编译生成apk,libhello-jni.so共享库会一起打包在apk文件内。

    原文链接:http://www.cnblogs.com/hibraincol/archive/2011/05/30/2063847.html

    ]]>
    为何要用到NDK?
    概括来说主要分为以下几种情况:

    1. 代码的保护,由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大。
    2. 在NDK中调用第三方C/C++库,因为大部分的开源库都是用C/C++代码编写的。
    3. 便于移植,用C/C++写得库可以方便在其他的嵌入式平台上再次使用。
    ]]>
    <![CDATA[青春不再 | 马加油DE博客]]> http://mjiayou.com/2014/08/18/hexo-theme-modify-based-light/ 2014-08-18T11:55:15.000Z 2015-08-20T02:58:54.000Z 一贯喜欢简约的风格,看到官方hexo-theme-light差不多能到碗里来,但是一旦“差不多”就说明还差一点,尤其是一些天朝内使用不便的链接或者功能,不改用起来就有种水土不服的感觉。也有一些国内开发者基于light主题的二次开发主题,但是本着自己动手丰衣足食的口号,决定为自己量身定做一份,记录如下:

    1.更换googleapis相关的链接;

    这是水土不服表现之一,如果不改这个页面加载起来有种生不如死的感觉,所以先改它。

    找到

    1
    ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js

    替换为

    1
    ajax.useso.com/ajax/libs/jquery/2.0.3/jquery.min.js

    1.2 文件 source/css/_base/variable.styl

    找到

    1
    fonts.googleapis.com/css?family=Lato:400,400italic

    替换为

    1
    fonts.useso.com/css?family=Lato:400,400italic

    附:landscape正房主题的googleapis相关的链接修改

    找到

    1
    ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js

    替换为

    1
    ajax.useso.com/ajax/libs/jquery/2.0.3/jquery.min.js

    2 文件 layout/_partial/head.ejs

    找到

    1
    fonts.googleapis.com/css?family=Source+Code+Pro

    替换为

    1
    fonts.useso.com/css?family=Source+Code+Pro

    2.分享

    这是水土不服表现之二,默认自带的是AddThis,这再国外好像是相当火(反正我没用过),进文章一看便发现都是分享到facebook、twitter等之类的网站,显然是不符合国情的,于是决定换成百度分享。

    2.1 文件 layout/_partial/post/share.ejs

    内容全部替换为

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    <div class="bdsharebuttonbox">
    <a href="#" class="bds_more" data-cmd="more"></a>
    <a href="#" class="bds_qzone" data-cmd="qzone"></a>
    <a href="#" class="bds_tsina" data-cmd="tsina"></a>
    <a href="#" class="bds_tqq" data-cmd="tqq"></a>
    <a href="#" class="bds_renren" data-cmd="renren"></a>
    <a href="#" class="bds_weixin" data-cmd="weixin"></a>
    </div>

    <script>
    window._bd_share_config =
    {
    "common": {
    "bdSnsKey": {},
    "bdText": "",
    "bdMini": "2",
    "bdPic": "",
    "bdStyle": "0",
    "bdSize": "16"
    },
    "share":
    {},
    "image":
    {
    "viewList": ["qzone", "tsina", "tqq", "renren", "weixin"],
    "viewText": “分享到",
    "viewSize": "16"
    },
    "selectShare": {
    "bdContainerClass": null,
    "bdSelectMiniList": ["qzone", "tsina", "tqq", "renren", "weixin"]
    }
    };
    with(document) 0[(getElementsByTagName('head')[0] || body).appendChild(createElement('script')).src = 'http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion=' + ~(-new Date() / 36e5)];
    </script>

    3.雷竞技官方下载地址appios

    这是水土不服表现之三,默认自带的是disqus,就雷竞技官方下载地址appios它再国外是火不火的无聊问题了,反正在国内用起来比较费劲,果断换成多说。

    3.1 文件 hexo/_config.yml

    添加

    1
    duoshuo_shortname: xxx

    注:其实xxx是你在多说系统注册的一个shortname,这方面自行科普。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <script type="text/javascript">
    var duoshuo_shortname = '<%= config.duoshuo_shortname %>';
    var duoshuoQuery = {short_name:duoshuo_shortname};
    (function() {
    var ds = document.createElement('script');
    ds.type = 'text/javascript';ds.async = true;
    ds.src = 'http://static.duoshuo.com/embed.js';
    ds.charset = 'UTF-8';
    (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(ds);
    })();
    </script>

    3.3 显示正文雷竞技官方下载地址appios,文件 layout/_partial/comment.ejs

    全文替换为

    1
    2
    3
    4
    5
    6
    <% if (page.comments){ %>
    <section id="comment">
    <h1 class="title"><%= __('comment') %></h1>
    <div class="ds-thread" data-thread-key="<%- item.path %>"></div>
    </section>
    <% } %>

    3.4 显示列表雷竞技官方下载地址appios数,文件 layout/_partial/article.ejs

    找到

    1
    2
    3
    4
    5
    <% if (item.comment && config.disqus_shortname){ %>
    <div class="alignright">
    <a href="<%- item.permalink %>#disqus_thread" class="comment-link">Comments</a>
    </div>
    <% } %>

    替换为

    1
    2
    3
    <% if (!item.comment){ %>
    <a href="<%- config.root %><%- item.path %>" class="ds-thread-count comment-link alignright" data-thread-key="<%- item.path %>" data-count-type="comments"></a>
    <% } %>

    4.百度站内搜索

    这是水土不服表现之四,默认使用的是google搜索,就不解释了,换成百度吧。

    4.1 文件 layout/_widget/search.ejs

    全文替换为

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <SCRIPT language=javascript>
    function search(formname) {
    formname.method = "get";
    formname.action = "http://www.baidu.com/baidu";
    document.search_form.word.value = document.search_form.word.value + " site:mjiayou.com";
    return true;
    }
    </SCRIPT>


    <div class="search">
    <form name="search_form" target="_blank" onsubmit="search(this)">
    <input type="search" name="word" results="0" placeholder="<%= __('百度站内搜索') %>" onblur="this.value=''">
    <!-- <input type="submit" value="搜索"> -->
    </form>
    </div>

    注:其实搜索框的操作是有bug的,待解决

    以上基本是必修内容,确保博客系统能全功能运转,以下为选修内容

    5.添加footer备案号

    域名11年注册,用了小四年,终于在前段时间给备案了,也体验以下当合法站长的感觉,得拿出来嘚瑟嘚瑟。

    5.1 文件 layout/_partial/footer.ejs

    找到

    1
    2
    3
    4
    5
    <% if (config.author){ %>
    &copy; <%= new Date().getFullYear() %> <%= config.author %>
    <% } else { %>
    &copy; <%= new Date().getFullYear() %> <%= config.title %>
    <% } %>

    替换为

    1
    2
    &copy; 2011-<%= new Date().getFullYear() %> <%= config.author %>
    <a href="http://www.miitbeian.gov.cn/">京ICP备15042793号</a>

    6.添加常用widget

    6.1 新浪微博,新建文件 layout/_widget/weibo.ejs

    内容如下(代码请自行去自己微博索取)

    1
    2
    3
    <iframe width="100%" height="550" class="share_self" frameborder="0" scrolling="no" 
    src="http://widget.weibo.com/weiboshow/index.php?language=&width=0&height=550&fansRow=1&ptype=1&speed=0&skin=9&isTitle=1&noborder=1&isWeibo=1&isFans=1&uid=1734508991&verifier=faa09416&dpc=1">
    </iframe>

    6.2 友链,新建文件 layout/_widget/blogroll.ejs

    内容如下

    1
    2
    3
    4
    5
    6
    7
    <div class="widget tag">
    <h3 class="title">友情链接</h3>
    <ul class="entry">
    <li><a href="http://www.cnblogs.com/" title="博客园">博客园</a></li>
    <li><a href="http://capegf.im/" title="Capegf's blog">Capegf's blog</a></li>
    </ul>
    </div>

    6.x 添加widget,文件 light/_config.yml

    在widgets:位置添加

    1
    2
    3
    4
    widgets:
    -
    - weibo
    - blogroll

    7.修改widget

    主要因为这个theme没有默认的archive widget,于是手动添加,又想和category、tag的widget保持一致,于是还得修改下styl。

    7.1 新建文件 layout/_widget/archive.ejs

    内容如下

    1
    2
    3
    4
    5
    6
    <% if (site.posts.length){ %>
    <div class="widget tag">
    <h3 class="title"><%= __('archive_a') %></h3>
    <%- list_archives() %>
    </div>
    <% } %>

    7.2 文件 layout/_widget/category.ejs

    全文替换为

    1
    2
    3
    4
    5
    6
    <% if (site.categories.length){ %>
    <div class="widget tag">
    <h3 class="title"><%= __('categories') %></h3>
    <%- list_categories() %>
    </div>
    <% } %>

    7.3 文件 layout/_widget/_widget/tag.ejs

    全文替换为

    1
    2
    3
    4
    5
    6
    <% if (site.tags.length){ %>
    <div class="widget tag">
    <h3 class="title"><%= __('tags') %></h3>
    <%- list_tags() %>
    </div>
    <% } %>

    7.4 文件 source/css/_partial/sidebar.styl

    添加

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    .category-list-count
    .tag-list-count
    .archive-list-count
    padding-left: 15px
    color color-meta
    font-size: 0.85em
    &:before
    content: "("

    &:after
    content: ")"


    .category-list
    .tag-list
    .archive-list
    font-size 0.9em
    padding 15px 20px
    ul, ol, dl
    list-style none

    7.Fork me on Github

    主要就是左上角fork me on github的图片展示,方便跳转github,一定的装x成分。

    7.1 新建文件 layout/_widget/forkme.ejs

    内容如下

    1
    2
    3
    4
    5
    <%if(page.layout !== 'false'){%>
    <%}else{ %>
    <%- page.content %>
    <%};%>
    <a href="https://github.com/treason258" target="_blank"><img style="position: absolute; top: 0; left: 0; border: 0;" src="http://mjiayou.com/trefiles/image/forkme_left_white_ffffff.png" alt="Fork me on GitHub"></a>

    7.2 文件 layout/layout.ejs

    添加

    1
    <%- partial('_widget/forkme') %>

    8.关于页面、RSS页面

    8.1 文件 layout/_partial/header.ejs

    添加

    1
    2
    <li><a href="<%- config.root %>about-impress.html" target="_blank">关于</a></li>
    <li><a href="<%- config.root %>atom.xml" target="_blank">RSS</a></li>

    持续更新…

    ]]>
    一贯喜欢简约的风格,看到官方hexo-theme-light差不多能到碗里来,但是一旦“差不多”就说明还差一点,尤其是一些天朝内使用不便的链接或者功能,不改用起来就有种水土不服的感觉。也有一些国内开发者基于light主题的二次开发主题,但是本着自己动手丰衣足食的口号,决定为自己量身定做一份,记录如下:

    1.更换googleapis相关的链接;

    这是水土不服表现之一,如果不改这个页面加载起来有种生不如死的感觉,所以先改它。

    ]]>
    <![CDATA[青春不再 | 马加油DE博客]]> http://mjiayou.com/2014/08/17/note-time/ 2014-08-17T07:33:09.000Z 2014-08-22T07:42:17.000Z 荏苒,如梭。

    早上醒来微博各种刷EXO经纪人机场打人的新闻,对于艺人打人事件早已司空见惯,我只想问:EXO是干嘛的?手贱的我还是百度了一下:12人男子组合?这么多人能认的过来么,然后我就猜测是不是和十二生肖有半点关系。当打开图片一栏英姿的时候,看到的是洗剪吹和剪头手,再仔细观察清一色的白脸蛋儿、双眼皮、高鼻梁、小嘴巴、尖下巴,目测出自同一批次模板。。。

    如果想吐槽还会有一大堆的话,不过关于EXO说到此为止,不是重点,不予置评。就像当前周杰伦刚正火的时候,叔叔说他唱的乱七八糟什么东西,而我总是能说出一大锥自以为“JAY音乐人生”得道理去反驳,估计EXO的粉更会长江后浪推前浪。

    想说的是:时光。有时候地铁上的电视会播xx音乐风云榜,才发现已经没有几个认识的“当红明星”,近几年流行的跨年晚会每上台一个帅哥美女就引起欢呼,而我只想问这是谁,就像年长的一辈很难接受周杰伦一样,已年长。想起小时候年长一辈喜欢听《萍聚》、《女人花》之类的老歌,再想起大街小巷都放周杰伦的歌的那个年代,原来《七里香》、《东风破》俨然已经成为“老歌”,这一前一后过了三个时代,时间都去哪儿了?

    时光荏苒,记得初中的时候最喜欢带着一个随身听,放学后跟着小伙伴去篮球场,一边看他们打篮球随时替补,一边听着随身听。那时候听的最多的是BEYOND、周杰伦、小刚,买的第一盘磁带是《寻找周杰伦》。而今BEYOND随着家驹早逝早已不复存在,周杰伦的音乐也貌似江郎才尽跨界去挖金,小刚貌似好久没了动静。但是音乐仍在继续,让我想起家驹的一句话:有音乐的地方就没有世界末日。

    岁月如梭,从16岁的好学生到18岁的叛逆期,辜负了所有人对我的期望。再从20岁的浪子回头到22岁的坚定梦想,努力的准备着。一路走到现在,前些天刚过了24岁的生日,不大不小的年纪,就算有说干就干的魄力,但是没了拿青春赌明天的资本。有时候看看身边的93年94年,哎,说年轻真好略显装B,但是,真好。

    本文毫无重点,睡了。

    ]]>
    荏苒,如梭。

    早上醒来微博各种刷EXO经纪人机场打人的新闻,对于艺人打人事件早已司空见惯,我只想问:EXO是干嘛的?手贱的我还是百度了一下:12人男子组合?这么多人能认的过来么,然后我就猜测是不是和十二生肖有半点关系。当打开图片一栏英姿的时候,看到的是洗剪吹和剪头手,再仔细观察清一色的白脸蛋儿、双眼皮、高鼻梁、小嘴巴、尖下巴,目测出自同一批次模板。。。

    ]]>
    <![CDATA[青春不再 | 马加油DE博客]]> http://mjiayou.com/2014/08/15/hexo-maxiang/ 2014-08-15T04:53:54.000Z 2015-08-15T09:00:00.000Z 欢迎使用马克飞象

    @(示例笔记本)[马克飞象|帮助|Markdown]

    马克飞象是一款专为印象笔记(Evernote)打造的Markdown编辑器,通过精心的设计与技术实现,配合印象笔记强大的存储和同步功能,带来前所未有的书写体验。特点概述:

  • 功能丰富 :支持高亮代码块、LaTeX 公式、流程图,本地图片以及附件上传,甚至截图粘贴,工作学习好帮手;
  • 得心应手 :简洁高效的编辑器,提供桌面离线客户端,支持移动端 Web;
  • 深度整合 :支持选择笔记本和添加标签,支持从印象笔记跳转编辑,轻松管理。

  • [TOC]

    Markdown简介

    Markdown 是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档,然后转换成格式丰富的HTML页面。 —— 维基百科

    正如您在阅读的这份文档,它使用简单的符号标识不同的标题,将某些文字标记为粗体或者斜体,创建一个链接或一个脚注[^demo]。下面列举了几个高级功能,更多语法请按Ctrl + /查看帮助。

    代码块

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    @requires_authorization
    def somefunc(param1='', param2=0):
    '''A docstring'''
    if param1 > param2: # interesting
    print 'Greater'
    return (param2 - param1 + 1) or None
    class SomeClass:
    pass
    >>> message = '''interpreter
    ... prompt'''

    LaTeX 公式

    可以创建行内公式,例如 $\Gamma(n) = (n-1)!\quad\forall n\in\mathbb N$。或者块级公式:

    $$ x = \dfrac{-b \pm \sqrt{b^2 - 4ac}}{2a} $$

    表格

    Item Value Qty
    Computer
    1600 USD
    5
    Phone
    12 USD
    12
    Pipe
    1 USD
    234

    流程图

    1
    st=>start: Start
    e=>end
    op=>operation: My Operation
    cond=>condition: Yes or No?
    
    st->op->cond
    cond(yes)->e
    cond(no)->op

    以及时序图:

    1
    Alice->Bob: Hello Bob, how are you?
    Note right of Bob: Bob thinks
    Bob-->Alice: I am good thanks!

    提示:想了解更多,请查看流程图语法以及时序图语法

    复选框

    使用 - [ ]- [x] 语法可以创建复选框,实现 todo-list 等功能。例如:

  • [x] 已完成事项
  • [ ] 待办事项1
  • [ ] 待办事项2
  • 注意:目前支持尚不完全,在印象笔记中勾选复选框是无效、不能同步的,所以必须在马克飞象中修改 Markdown 原文才可生效。下个版本将会全面支持。

    印象笔记相关

    笔记本和标签

    马克飞象增加了@(笔记本)[标签A|标签B]语法, 以选择笔记本和添加标签。 绑定账号后, 输入(自动会出现笔记本列表,请从中选择。

    笔记标题

    马克飞象会自动使用文档内出现的第一个标题作为笔记标题。例如本文,就是第一行的 欢迎使用马克飞象

    快捷编辑

    保存在印象笔记中的笔记,右上角会有一个红色的编辑按钮,点击后会回到马克飞象中打开并编辑该笔记。

    注意:目前用户在印象笔记中单方面做的任何修改,马克飞象是无法自动感知和更新的。所以请务必回到马克飞象编辑。

    数据同步

    马克飞象通过将Markdown原文以隐藏内容保存在笔记中的精妙设计,实现了对Markdown的存储和再次编辑。既解决了其他产品只是单向导出HTML的单薄,又规避了服务端存储Markdown带来的隐私安全问题。这样,服务端仅作为对印象笔记 API调用和数据转换之用。

    隐私声明:用户所有的笔记数据,均保存在印象笔记中。马克飞象不存储用户的任何笔记数据。

    离线存储

    马克飞象使用浏览器离线存储将内容实时保存在本地,不必担心网络断掉或浏览器崩溃。为了节省空间和避免冲突,已同步至印象笔记并且不再修改的笔记将删除部分本地缓存,不过依然可以随时通过文档管理打开。

    注意:虽然浏览器存储大部分时候都比较可靠,但印象笔记作为专业云存储,更值得信赖。以防万一,请务必经常及时同步到印象笔记

    编辑器相关

    设置

    右侧系统菜单(快捷键Ctrl + M)的设置中,提供了界面字体、字号、自定义CSS、vim/emacs 键盘模式等高级选项。

    快捷键

    帮助 Ctrl + /
    同步文档 Ctrl + S
    创建文档 Ctrl + Alt + N
    最大化编辑器 Ctrl + Enter
    预览文档 Ctrl + Alt + Enter
    文档管理 Ctrl + O
    系统菜单 Ctrl + M

    加粗 Ctrl + B
    插入图片 Ctrl + G
    插入链接 Ctrl + L
    提升标题 Ctrl + H

    关于收费

    马克飞象为新用户提供 10 天的试用期,试用期过后需要续费才能继续使用。未购买或者未及时续费,将不能同步新的笔记。之前保存过的笔记依然可以编辑。

    反馈与建议

  • 微博:@马克飞象@GGock
  • 邮箱:hustgock@gmail.com

  • 感谢阅读这份帮助文档。请点击右上角,绑定印象笔记账号,开启全新的记录与分享体验吧。

    [^demo]: 这是一个示例脚注。请查阅 MultiMarkdown 文档 关于脚注的说明。 限制: 印象笔记的笔记内容使用 ENML 格式,基于 HTML,但是不支持某些标签和属性,例如id,这就导致脚注TOC无法正常点击。

    ]]>
    欢迎使用马克飞象

    @(示例笔记本)[马克飞象|帮助|Markdown]

    马克飞象是一款专为印象笔记(Evernote)打造的Markdown编辑器,通过精心的设计与技术实现,配合印象笔记强大的存储和同步功能,带来前所未有的书写体验。特点概述:

  • 功能丰富 :支持高亮代码块、LaTeX 公式、流程图,本地图片以及附件上传,甚至截图粘贴,工作学习好帮手;
  • 得心应手 :简洁高效的编辑器,提供桌面离线客户端,支持移动端 Web;
  • 深度整合 :支持选择笔记本和添加标签,支持从印象笔记跳转编辑,轻松管理。
  • ]]>
    <![CDATA[青春不再 | 马加油DE博客]]> http://mjiayou.com/2014/08/14/hexo-zybuluo-mdeditor/ 2014-08-14T04:53:54.000Z 2015-08-15T09:00:00.000Z 欢迎使用 Cmd Markdown 编辑阅读器

    我们理解您需要更便捷更高效的工具记录思想,整理笔记、知识,并将其中承载的价值传播给他人,Cmd Markdown 是我们给出的答案 —— 我们为记录思想和分享知识提供更专业的工具。 您可以使用 Cmd Markdown:

  • 整理知识,学习笔记
  • 发布日记,杂文,所见所想
  • 撰写发布技术文稿(代码支持)
  • 撰写发布学术论文(LaTeX 公式支持)
  • cmd-markdown-logo

    除了您现在看到的这个 Cmd Markdown 在线版本,您还可以前往以下网址下载:

    Windows/Mac/Linux 全平台客户端

    请保留此份 Cmd Markdown 的欢迎稿兼使用说明,如需撰写新稿件,点击顶部工具栏右侧的 新文稿 或者使用快捷键 Ctrl+Alt+N


    什么是 Markdown

    Markdown 是一种方便记忆、书写的纯文本标记语言,用户可以使用这些标记符号以最小的输入代价生成极富表现力的文档:譬如您正在阅读的这份文档。它使用简单的符号标记不同的标题,分割不同的段落,粗体 或者 斜体 某些文字,更棒的是,它还可以

    1. 制作一份待办事宜 Todo 列表

  • [ ] 支持以 PDF 格式导出文稿
  • [ ] 改进 Cmd 渲染算法,使用局部渲染技术提高渲染效率
  • [x] 新增 Todo 列表功能
  • [x] 修复 LaTex 公式渲染问题
  • [x] 新增 LaTex 公式编号功能
  • 2. 书写一个质能守恒公式[^LaTeX]

    $$E=mc^2$$

    3. 高亮一段代码[^code]

    1
    2
    3
    4
    5
    6
    7
    @requires_authorization
    class SomeClass:
    pass

    if __name__ == '__main__':
    # A comment
    print 'hello world'

    4. 高效绘制 流程图

    1
    st=>start: Start
    op=>operation: Your Operation
    cond=>condition: Yes or No?
    e=>end
    
    st->op->cond
    cond(yes)->e
    cond(no)->op

    5. 高效绘制 序列图

    1
    Alice->Bob: Hello Bob, how are you?
    Note right of Bob: Bob thinks
    Bob-->Alice: I am good thanks!

    6. 绘制表格

    项目 价格 数量
    计算机
    \$1600
    5
    手机
    \$12
    12
    管线
    \$1
    234

    7. 更详细语法说明

    想要查看更详细的语法说明,可以参考我们准备的 Cmd Markdown 简明语法手册,进阶用户可以参考 Cmd Markdown 高阶语法手册 了解更多高级功能。

    总而言之,不同于其它 所见即所得 的编辑器:你只需使用键盘专注于书写文本内容,就可以生成印刷级的排版格式,省却在键盘和工具栏之间来回切换,调整内容和格式的麻烦。Markdown 在流畅的书写和印刷级的阅读体验之间找到了平衡。 目前它已经成为世界上最大的技术分享网站 GitHub 和 技术问答网站 StackOverFlow 的御用书写格式。


    什么是 Cmd Markdown

    您可以使用很多工具书写 Markdown,但是 Cmd Markdown 是这个星球上我们已知的、最好的 Markdown 工具——没有之一 :)因为深信文字的力量,所以我们和你一样,对流畅书写,分享思想和知识,以及阅读体验有极致的追求,我们把对于这些诉求的回应整合在 Cmd Markdown,并且一次,两次,三次,乃至无数次地提升这个工具的体验,最终将它演化成一个 编辑/发布/阅读 Markdown 的在线平台——您可以在任何地方,任何系统/设备上管理这里的文字。

    1. 实时同步预览

    我们将 Cmd Markdown 的主界面一分为二,左边为编辑区,右边为预览区,在编辑区的操作会实时地渲染到预览区方便查看最终的版面效果,并且如果你在其中一个区拖动滚动条,我们有一个巧妙的算法把另一个区的滚动条同步到等价的位置,超酷!

    2. 编辑工具栏

    也许您还是一个 Markdown 语法的新手,在您完全熟悉它之前,我们在 编辑区 的顶部放置了一个如下图所示的工具栏,您可以使用鼠标在工具栏上调整格式,不过我们仍旧鼓励你使用键盘标记格式,提高书写的流畅度。

    tool-editor

    3. 编辑模式

    完全心无旁骛的方式编辑文字:点击 编辑工具栏 最右测的拉伸按钮或者按下 Ctrl + M,将 Cmd Markdown 切换到独立的编辑模式,这是一个极度简洁的写作环境,所有可能会引起分心的元素都已经被挪除,超清爽!

    4. 实时的云端文稿

    为了保障数据安全,Cmd Markdown 会将您每一次击键的内容保存至云端,同时在 编辑工具栏 的最右侧提示 已保存 的字样。无需担心浏览器崩溃,机器掉电或者地震,海啸——在编辑的过程中随时关闭浏览器或者机器,下一次回到 Cmd Markdown 的时候继续写作。

    5. 离线模式

    在网络环境不稳定的情况下记录文字一样很安全!在您写作的时候,如果电脑突然失去网络连接,Cmd Markdown 会智能切换至离线模式,将您后续键入的文字保存在本地,直到网络恢复再将他们传送至云端,即使在网络恢复前关闭浏览器或者电脑,一样没有问题,等到下次开启 Cmd Markdown 的时候,她会提醒您将离线保存的文字传送至云端。简而言之,我们尽最大的努力保障您文字的安全。

    6. 管理工具栏

    为了便于管理您的文稿,在 预览区 的顶部放置了如下所示的 管理工具栏

    tool-manager

    通过管理工具栏可以:

    发布:将当前的文稿生成固定链接,在网络上发布,分享
    新建:开始撰写一篇新的文稿
    删除:删除当前的文稿
    导出:将当前的文稿转化为 Markdown 文本或者 Html 格式,并导出到本地
    列表:所有新增和过往的文稿都可以在这里查看、操作
    模式:切换 普通/Vim/Emacs 编辑模式

    7. 阅读工具栏

    tool-manager

    通过 预览区 右上角的 阅读工具栏,可以查看当前文稿的目录并增强阅读体验。

    工具栏上的五个图标依次为:

    目录:快速导航当前文稿的目录结构以跳转到感兴趣的段落
    视图:互换左边编辑区和右边预览区的位置
    主题:内置了黑白两种模式的主题,试试 黑色主题,超炫!
    阅读:心无旁骛的阅读模式提供超一流的阅读体验
    全屏:简洁,简洁,再简洁,一个完全沉浸式的写作和阅读环境

    8. 阅读模式

    阅读工具栏 点击 或者按下 Ctrl+Alt+M 随即进入独立的阅读模式界面,我们在版面渲染上的每一个细节:字体,字号,行间距,前背景色都倾注了大量的时间,努力提升阅读的体验和品质。

    9. 标签、分类和搜索

    在编辑区任意行首位置输入以下格式的文字可以标签当前文档:

    标签: 未分类

    标签以后的文稿在【文件列表】(Ctrl+Alt+F)里会按照标签分类,用户可以同时使用键盘或者鼠标浏览查看,或者在【文件列表】的搜索文本框内搜索标题关键字过滤文稿,如下图所示:

    file-list

    10. 文稿发布和分享

    在您使用 Cmd Markdown 记录,创作,整理,阅读文稿的同时,我们不仅希望它是一个有力的工具,更希望您的思想和知识通过这个平台,连同优质的阅读体验,将他们分享给有相同志趣的人,进而鼓励更多的人来到这里记录分享他们的思想和知识,尝试点击 (Ctrl+Alt+P) 发布这份文档给好友吧!


    再一次感谢您花费时间阅读这份欢迎稿,点击 (Ctrl+Alt+N) 开始撰写新的文稿吧!祝您在这里记录、阅读、分享愉快!

    作者 @ghosert
    2015 年 06月 15日

    [^LaTeX]: 支持 LaTeX 编辑显示支持,例如:$\sum_{i=1}^n a_i=0$, 访问 MathJax 参考更多使用方法。

    [^code]: 代码高亮功能支持包括 Java, Python, JavaScript 在内的,四十一种主流编程语言。

    ]]>
    欢迎使用 Cmd Markdown 编辑阅读器

    我们理解您需要更便捷更高效的工具记录思想,整理笔记、知识,并将其中承载的价值传播给他人,Cmd Markdown 是我们给出的答案 —— 我们为记录思想和分享知识提供更专业的工具。 您可以使用 Cmd Markdown:

  • 整理知识,学习笔记
  • 发布日记,杂文,所见所想
  • 撰写发布技术文稿(代码支持)
  • 撰写发布学术论文(LaTeX 公式支持)
  • ]]>
    <![CDATA[青春不再 | 马加油DE博客]]> http://mjiayou.com/2014/08/04/android-mainfest/ 2014-08-04T05:29:39.000Z 2015-08-20T05:13:14.000Z ```xml

    android:allowTaskReparenting

    是否可以将目标activity从启动它的那个Task移动到他自己定义的而且马上要显示的那个Task.如果为false,它就会留在启动它的那个Task中.

    android:alwaysRetainTaskState

    是否让系统保留任务的最后状态. 一般情况下, 在按home键后再次启动应用,系统会去除栈内所有在根活动之上的活动; 或者某任务经过一段时间没有被访问时也会被系统清除其他活动. 本选项仅对根活动有意义,其他活动包含此标签会被忽略.

    ndroid:clearTaskOnLaunch

    是否在从 home 界面重新启动时清空Task. 如果为 true, 每次用户启动任务, 用户都被带到根活动.不管他们最后在做什么,也不管是按BACK或HOME键最后离开的它. 如果是 false, 则不会这样.

    例如,假设用户从 home 启动 P , 然后从P启动 Q , 用户又点击了HOME, 然后又启动了P. 正常情况下用户将会看到Q, 因为这是用户最后在 P 中做的工作. 如果P中将此标志设置为 true ,当用户点击 home 时所有的P之上的活动都会被清除, 所以用户再次点击回来时会只能看到 P.

    如果这个属性和 allowTaskReparenting 同时为 true 时, 所有的可以被 re-parented 的活动都被移到他们共享亲戚关系的任务中, 剩下的活动都被丢弃了.

    android:finishOnTaskLaunch

    在用户从 home 界面重新启动应用时, 是否结束掉这个活动. 如果这个属性和 allowTaskReparenting 同时为 true 时, 本属性会干掉那一个属性. 本活动的亲戚也会被忽略. 这个活动将会被销毁.

    android:launchMode

    用例启动模式多实例注释

    适合大部分活动的普通模式”standard”Yes默认值.系统总是会创建一个新实例

    “singleTop”Conditionally如果一个实例已经存在在目标任务的栈顶,则复用,否则会创建新实例. 可以通过重写 onNewIntent() 来捕获

    特殊启动方法

    (不推荐用于一般应用)”singleTask”No如果目标活动不存在,则会创建它并放在目标任务栈底, 然后启动它;

    如果目标活动已存在, 则会启动它并执行它的 onNewIntent() 方法

    “singleInstance”No与 “singleTask” 相同, 但是这个活动将会独占一个任务

    android:allowTaskReparenting

    是否允许activity更换从属的任务,比如从短信息任务 切换到浏览器任务。

    android:alwaysRetainTaskState

    是否保留状态不变, 比如切换回home, 再从新打开, activity处于最后的状态

    android:clearTaskOnLanunch

    比如 P 是 activity, Q 是被P 触发的 activity, 然后返回Home, 从新启动 P, 是否显示 Q

    android:configChanges

    当配置list发生修改时, 是否调用 onConfigurationChanged() 方法 比如 “locale|navigation|orientation”.

    android:enabled

    activity 是否可以被实例化,

    android:excludeFromRecents

    是否可被显示在最近打开的activity列表里

    android:exported

    是否允许activity被其它程序调用

    android:finishOnTaskLaunch

    是否关闭已打开的activity当用户重新启动这个任务的时候

    android.icon

    android:label

    android:launchMode

    activity启动方式, “standard” “singleTop” “singleTask” “singleInstance” 其中前两个为一组, 后两个为一组

    android:multiprocess

    允许多进程

    android:name

    activity的类名, 必须指定


    android:onHistory

    是否需要移除这个activity当用户切换到其他屏幕时。 这个属性是 API level 3 中引入的

    android:permission

    android:process

    一个activity运行时所在的进程名, 所有程序组件运行在应用程序默认的进程中,这个进程名跟应用程序的包名一致。中的元素process属性能够为所有组件设定一个新的默认值。但是任何组件都可以覆盖这个默认值,允许你将你的程序放在多进程中运行。 如果这个属性被分配的名字以:开头, 当这个activity运行时, 一个新的专属于这个程序的进程将会被创建。 如果这个进程名以小写字母开头, 这个activity将会运行在全局的进程中,被它的许可所提供。

    android:screenOrientation

    activity显示的模式, “unspecified” 默认值 “landscape” 风景画模式,宽度比高度大一些 “portrait” 肖像模式, 高度比宽度大。 “user” 用户的设置 “behind” “sensor” “nosensor”


    android:stateNotNeeded

    是否 activity被销毁和成功重启并不保存状态


    android:taskAffinity

    activity的亲属关系, 默认情况同一个应用程序下的activity有相同的关系


    android:theme

    activity的样式主题, 如果没有设置,则activity的主题样式从属于应用程序, 参见元素的theme属性

    android:windowSoftInputMode

    activity主窗口与软键盘的交互模式, 自从API level 3 被引入

    转载自:http://www.cnblogs.com/xilinch/archive/2012/07/17/2595613.html

    ]]>
    ```xml

    android:allowTaskReparenting

    是否可以将目标activity从启动它的那个Task移动到他自己定义的而且马上要显示的那个Task.如果为false,它就会留在启动它的那个Task中.

    ]]>
    <![CDATA[青春不再 | 马加油DE博客]]> http://mjiayou.com/2014/08/04/android-adb-shell/ 2014-08-04T05:29:37.000Z 2015-08-20T04:15:57.000Z
    1
    adb shell am start [options] <INTENT>

    作用:启动一个activity
    举例:adb shell am start -a com.lt.test.action.SECOND
    举例:adb shell am start -n com.lt.test/.MyActivity
    说明:[options]与参见 http://developer.android.com/tools/help/adb.html#am

    1
    adb shell am startservice [options] <INTENT>

    作用:启动一个service
    举例:adb shell am startservice -a com.lt.test.action.ONESERVICE
    举例:adb shell am startservice -n com.lt.test/.MyService

    1
    adb shell am force-stop <PACKAGE>

    作用:强制关闭一个应用程序
    举例:adb shell am force-stop com.lt.test

    1
    adb shell am broadcast [options] <INTENT>

    作用:发送一个广播
    举例:adb shell am broadcast -a “action_finish” (发送一个广播去关闭一个activity)
    举例:adb shell am broadcast -a android.intent.action.MASTER_CLEAR(恢复出厂设置的方法,会清除内存所有内容)
    举例:adb shell am broadcast -n com.lt.test/.MyBroadcast

    1
    adb shell pm list packages [options] <INTENT>

    作用:列举出所有包含的package
    举例:adb shell pm list packages com.lt
    说明:[options]与参见 http://developer.android.com/tools/help/adb.html#pm

    参考链接:
    http://developer.android.com/tools/help/adb.html

    转载自:http://blog.sina.com.cn/s/blog_51335a0001017ux5.html

    ]]>
    1
    adb shell am start [options] <INTENT>

    作用:启动一个activity
    举例:adb shell am start -a com.lt.test.action.SECOND
    举例:adb shell am start -n com.lt.test/.MyActivity
    说明:[options]与参见 http://developer.android.com/tools/help/adb.html#am

    ]]>