进来逛论坛发现hexo已经升级到3.x版本了,我还停留在2.x的时代,于是乎更愿意体验更新的东西,开始升级,也怪手贱,就像顺便吧node也升级了吧,从之前的0.10.x升到最新的0.12.x,node升级一帆风顺,然后再安装hexo就遇坑了,好像是node-gyp缓存啥的本地路径,每次安装hexo还去寻找旧的版本,就这么坑了好会儿。
最终决定全部推翻重来,把node和hexo完全卸载,这次使用nvm的形式安装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
然后拖到终端执行,等一会儿大概一分钟左右,卸载完成
nvm(Node Version Manager)作为node版本管理,可以更方便的进行版本更新,保持环境清洁。1
$ wget -qO- https://raw.github.com/creationix/nvm/master/install.sh | sh
使用nvm安装node,这里安装的是0.12版本。1
$ nvm install 0.12
npm全称Node Package Manager,如果你熟悉ruby的gem,Python的PyPL、setuptools,PHP的pear,那么你就知道npm的作用是什么了。没错,它就是Nodejs的包管理器。
使用npm安装hexo3.x版本,一句话搞定。1
$ sudo npm install -g hexo-cli
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
安装完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已经升级到3.x版本了,我还停留在2.x的时代,于是乎更愿意体验更新的东西,开始升级,也怪手贱,就像顺便吧node也升级了吧,从之前的0.10.x升到最新的0.12.x,node升级一帆风顺,然后再安装hexo就遇坑了,好像是node-gyp缓存啥的本地路径,每次安装hexo还去寻找旧的版本,就这么坑了好会儿。
最终决定全部推翻重来,把node和hexo完全卸载,这次使用nvm的形式安装node,这样方便以后的版本升级管理,流程整理如下:
]]>其实默认情况下Android Studio生成mapping.txt等文件的路径是build/outputs/mapping/release/mapping.txt,之所以会出现在app文件夹下,是因为是混淆文件proguard-rules.pro中重新配置了生成路径,如下:
-printseeds seeds.txt
-printusage unused.txt
-printmapping mapping.txt
只要把这么几行注掉就哦了,备忘记录一下。
]]>通过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 设置字体的绝对大小
设置字体大小,单位可以选择像素或者是dp1
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);
}
}
通过Spannable对象我们可以设置textview的各种样式,其功能十分强大。通过SpannableString和它的setSpan(Object what, int start, int end, int flags)便可以对textview设置想要的效果了,这里的what就是效果名,start和end是设置这个样式针对的是textview的字符位置。
]]>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雷竞技官网入口的点击事件
]]>1
2
android:clickable=“true”
android:focusable=“true”
在子raybet雷竞技官网入口中添加1
android:duplicateParentState=“true”
一个好的动画一定是用心做出来的,何为用心?其中一点我认为定义适当的 Interpolator 就是一种用心的表现;这点在 google material design 中尤为明显。
一个好的动画一定要符合实际,一句老的话就是:石头下落一定要受重力才优雅,不然一颗石头像羽毛一样在风中还飘啊飘的那就不行了。
说到 Interpolator 啊,这个要从3年前说起,话说当年谷歌、诺基亚、Qiujuer 三分天下…. 哈哈,开个玩笑~
Interpolator 这个时间插值类,其主要使用在动画中,其作用主要是控制目标变量的变化值进行对应的变化。
你可以这么理解,现在小明去买酱油,规定时间是1个小时到达,里程是1公里;现在小明心里唯恐无法达到,所以先跑起来了,但因为体力消耗所以逐渐的慢下来了;然后成功到达。这样的一个过程中把小明逐渐慢下来的这个过程抽象出来也就是 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,直到最后时间结束。(这个后面单独说说)
这里说几个简单的源码
LinearInterpolator1
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();
}
}
最简单的一个由于是线性,所以直接返回。
DecelerateInterpolator1
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
51public 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
9public 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
30float 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
15public 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);传入值,此时不就能用上了?对不?
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 又没法打了。
最后送上福利,全部的实现类:
——学之开源,用于开源;初学者的心态,与君共勉!
========================================================
作者:qiujuer
博客:blog.csdn.net/qiujuer
网站:www.qiujuer.net
开源库:Genius-Android
转载请注明出处:http://blog.csdn.net/qiujuer/article/details/42430269
========================================================
]]>一个好的动画一定是用心做出来的,何为用心?其中一点我认为定义适当的 Interpolator 就是一种用心的表现;这点在 google material design 中尤为明显。
一个好的动画一定要符合实际,一句老的话就是:石头下落一定要受重力才优雅,不然一颗石头像羽毛一样在风中还飘啊飘的那就不行了。
最近在看了许多关于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
7public 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
17public 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);
}
最近在看了许多关于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));
}
项目用到了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
2
3
4
-keepattributes Signature
-keepattributes *Annotation*
-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.examples.android.model.** { *; }
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是你项目包名
首先习惯使用的错误方式是1
List<T> list = gson.fromJson(jsonString, type);
正确的方法应该是这样的1
2Type 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
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>;
}
1
2
3
-dontwarn com.f2prateek.dart.internal.**
-keep class **$$ExtraInjector { *; }
-keepnames class * { @com.f2prateek.dart.InjectExtra *;}
1
2
3
-keepclassmembers class ** {
public void onEvent*(**);
}
1
2
-keep class com.android.volley.** {* ;}
-keep class org.apache.http.** {* ;}
1
2
3
4
-keepattributes Signature
-keepattributes *Annotation*
-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.examples.android.model.** { *; }
1
-dontwarn com.squareup.okhttp.**
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);
}
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>;
}
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.** { *; }
1
2
3
4
5
6
-keepclassmembers class * {
public <init>(org.json.JSONObject);
}
-keep public class com.aijifu.mmbj.R$*{
public static final int *;
}
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 *;
}
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
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是你项目包名
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 ----------
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>;
}
手动编译Android工程时出现异常如下:1
2UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dex.DexException: Multiple dex files define Lcom/xxx/xxx/xxx
这个问题出现的原因是类的重复定义,即包的重复引用,意思就是项目的引用的某个包,而被作为library的项目也引用了同一个包。
找到1
compile fileTree(dir: 'libs', include: ['*.jar'])
修改成1
provided fileTree(dir: 'libs', include: ['*.jar'])
手动编译Android工程时出现异常如下:1
2UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dex.DexException: Multiple dex files define Lcom/xxx/xxx/xxx
这个问题出现的原因是类的重复定义,即包的重复引用,意思就是项目的引用的某个包,而被作为library的项目也引用了同一个包。
]]>使用的方法:
Java代码中:R.drawable.文件的名称
XML中:android:background=”@drawable/文件的名称”
属性:
[html] view plaincopy
其中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
其中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”?>
[html] view plaincopy
<?xml version=”1.0” encoding=”utf-8”?>
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
]]>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都加上才有用。
]]>Android-PullToRefresh 类似新浪微博,twitter,下拉刷新列表, 更牛的是还支持上拉加载更多。 不仅仅是ListView,而且GridView也支持。
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.
SlidingMenu 这个可以结合ActionBarSherlock
actionbarsherlock actionbar兼容到2.x
Left Locked Gallery android官方的Gallery是center lock的 意思是你只能居中显示你选中的item。 当你想要实现下面的界面时 用Left Locked Gallery就很方便了。
7.Stickygridheaders 和 StickyListHeaders 类似qq联系人那种。
android-square-progressbar 提供了在图片边框展示下载进度。
ActionsContentView ActionsContentView是一个左边menu导航条,关闭状态只显示缩略图标,用户可以点击图标进行快速切换,在左侧导航栏向右滑动,将打开导航条,可以查看完整导航条(缩略图+文字),选中其中一项,切换到对应界面,并关闭导航条。
导航条可以很多,超出屏幕部分可通过滑动导航条查看。
Swipe-to-Dismiss 实现listview列表
gifview 有些时候项目中需要播放gif,androidraybet雷竞技官网入口并没用提供,gifview应运而生,是比较了能找到的raybet雷竞技官网入口中,我个人认为最好的,推荐给大家。
Lockpatterngenerator 实现类似支付宝图案密码锁。前两天看到群里有人求这代码,特地寻找分享出来。
GridWichterle 功能其实很简单,显示网格,该软件是为设计师开发的,可以方便的查看间距是否符合规范。
Twidere 是一个强大的Twitter客户端,兼容Android 1.6以上版本。
ps:小编没有试,没有Twitter账号,看起来挺不错的,感兴趣的可以自己试下.
ListViewAnimations是一个很强大的Demo示例,包含了ListViews, GridViewsraybet雷竞技官网入口的很多动画如 滑入滑出, 飞入飞出,还包含滑动删除列表item项动画效果.效果挺不错的,推荐运行看下.
ShareSDK是 为iOS、Android、WindowsPhone提供社会功能的一个组件,开发者只需10分钟即可集成到自己的APP中,它不仅支持分享给QQ好友、微信好友、微信朋友圈、新浪微博、腾迅微博等以及facebook、twitter、google 等国内外主流的社交平台,还有强大的社会化分享统计分析管理后台. 不熟悉分享的朋友也可以相对比较轻松的实现社会化分享功能。
NewQuickAction3D 继承了popwindow实现弹出菜单选择,会根据raybet雷竞技官网入口的位置,选择在raybet雷竞技官网入口上面或下面,左对齐,居中或右对齐。
在项目中还是经常用到的。要符合实际项目的需求可能要稍作修改,是一个很不错的参考示例。
使用的方法:
Java代码中:R.drawable.文件的名称
XML中:Android:background=”@drawable/文件的名称”
属性:
其中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上查看代码片派生到我的代码片
下面就介绍下Android NDK的入门学习过程:
入门的最好办法就是学习Android自带的例子, 这里就通过学习Android的NDK自带的demo程序:hello-jni来达到这个目的。
一、 开发环境的搭建
如何下载和安装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 :
/*
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文件。
可以看到目前仅仅有几个标准的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
/*
/*
#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 :
/*
/* This is a trivial JNI example where we use a native method
jobject thiz )
{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
原文链接:http://www.cnblogs.com/hibraincol/archive/2011/05/30/2063847.html
]]>这是水土不服表现之一,如果不改这个页面加载起来有种生不如死的感觉,所以先改它。
找到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
fonts.googleapis.com/css?family=Lato:400,400italic
替换为1
fonts.useso.com/css?family=Lato:400,400italic
附:landscape正房主题的googleapis相关的链接修改
1 文件 layout/_partial/after_footer.ejs
找到
1ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js替换为
1ajax.useso.com/ajax/libs/jquery/2.0.3/jquery.min.js2 文件 layout/_partial/head.ejs
找到
1fonts.googleapis.com/css?family=Source+Code+Pro替换为
1fonts.useso.com/css?family=Source+Code+Pro
这是水土不服表现之二,默认自带的是AddThis,这再国外好像是相当火(反正我没用过),进文章一看便发现都是分享到facebook、twitter等之类的网站,显然是不符合国情的,于是决定换成百度分享。
内容全部替换为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>
这是水土不服表现之三,默认自带的是disqus,就雷竞技官方下载地址appios它再国外是火不火的无聊问题了,反正在国内用起来比较费劲,果断换成多说。
添加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>
全文替换为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>
<% } %>
找到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>
<% } %>
这是水土不服表现之四,默认使用的是google搜索,就不解释了,换成百度吧。
全文替换为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的,待解决
域名11年注册,用了小四年,终于在前段时间给备案了,也体验以下当合法站长的感觉,得拿出来嘚瑟嘚瑟。
找到1
2
3
4
5<% if (config.author){ %>
© <%= new Date().getFullYear() %> <%= config.author %>
<% } else { %>
© <%= new Date().getFullYear() %> <%= config.title %>
<% } %>
替换为1
2© 2011-<%= new Date().getFullYear() %> <%= config.author %>
<a href="http://www.miitbeian.gov.cn/">京ICP备15042793号</a>
内容如下(代码请自行去自己微博索取)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>
内容如下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>
在widgets:位置添加1
2
3
4widgets:
-
- weibo
- blogroll
主要因为这个theme没有默认的archive widget,于是手动添加,又想和category、tag的widget保持一致,于是还得修改下styl。
内容如下1
2
3
4
5
6<% if (site.posts.length){ %>
<div class="widget tag">
<h3 class="title"><%= __('archive_a') %></h3>
<%- list_archives() %>
</div>
<% } %>
全文替换为1
2
3
4
5
6<% if (site.categories.length){ %>
<div class="widget tag">
<h3 class="title"><%= __('categories') %></h3>
<%- list_categories() %>
</div>
<% } %>
全文替换为1
2
3
4
5
6<% if (site.tags.length){ %>
<div class="widget tag">
<h3 class="title"><%= __('tags') %></h3>
<%- list_tags() %>
</div>
<% } %>
添加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
主要就是左上角fork me on github的图片展示,方便跳转github,一定的装x成分。
内容如下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>
添加1
<%- partial('_widget/forkme') %>
添加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>
这是水土不服表现之一,如果不改这个页面加载起来有种生不如死的感觉,所以先改它。
]]>早上醒来微博各种刷EXO经纪人机场打人的新闻,对于艺人打人事件早已司空见惯,我只想问:EXO是干嘛的?手贱的我还是百度了一下:12人男子组合?这么多人能认的过来么,然后我就猜测是不是和十二生肖有半点关系。当打开图片一栏英姿的时候,看到的是洗剪吹和剪头手,再仔细观察清一色的白脸蛋儿、双眼皮、高鼻梁、小嘴巴、尖下巴,目测出自同一批次模板。。。
如果想吐槽还会有一大堆的话,不过关于EXO说到此为止,不是重点,不予置评。就像当前周杰伦刚正火的时候,叔叔说他唱的乱七八糟什么东西,而我总是能说出一大锥自以为“JAY音乐人生”得道理去反驳,估计EXO的粉更会长江后浪推前浪。
想说的是:时光。有时候地铁上的电视会播xx音乐风云榜,才发现已经没有几个认识的“当红明星”,近几年流行的跨年晚会每上台一个帅哥美女就引起欢呼,而我只想问这是谁,就像年长的一辈很难接受周杰伦一样,已年长。想起小时候年长一辈喜欢听《萍聚》、《女人花》之类的老歌,再想起大街小巷都放周杰伦的歌的那个年代,原来《七里香》、《东风破》俨然已经成为“老歌”,这一前一后过了三个时代,时间都去哪儿了?
时光荏苒,记得初中的时候最喜欢带着一个随身听,放学后跟着小伙伴去篮球场,一边看他们打篮球随时替补,一边听着随身听。那时候听的最多的是BEYOND、周杰伦、小刚,买的第一盘磁带是《寻找周杰伦》。而今BEYOND随着家驹早逝早已不复存在,周杰伦的音乐也貌似江郎才尽跨界去挖金,小刚貌似好久没了动静。但是音乐仍在继续,让我想起家驹的一句话:有音乐的地方就没有世界末日。
岁月如梭,从16岁的好学生到18岁的叛逆期,辜负了所有人对我的期望。再从20岁的浪子回头到22岁的坚定梦想,努力的准备着。一路走到现在,前些天刚过了24岁的生日,不大不小的年纪,就算有说干就干的魄力,但是没了拿青春赌明天的资本。有时候看看身边的93年94年,哎,说年轻真好略显装B,但是,真好。
本文毫无重点,睡了。
]]>早上醒来微博各种刷EXO经纪人机场打人的新闻,对于艺人打人事件早已司空见惯,我只想问:EXO是干嘛的?手贱的我还是百度了一下:12人男子组合?这么多人能认的过来么,然后我就猜测是不是和十二生肖有半点关系。当打开图片一栏英姿的时候,看到的是洗剪吹和剪头手,再仔细观察清一色的白脸蛋儿、双眼皮、高鼻梁、小嘴巴、尖下巴,目测出自同一批次模板。。。
]]>@(示例笔记本)[马克飞象|帮助|Markdown]
马克飞象是一款专为印象笔记(Evernote)打造的Markdown编辑器,通过精心的设计与技术实现,配合印象笔记强大的存储和同步功能,带来前所未有的书写体验。特点概述:
[TOC]
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'''
可以创建行内公式,例如 $\Gamma(n) = (n-1)!\quad\forall n\in\mathbb N$。或者块级公式:
$$ x = \dfrac{-b \pm \sqrt{b^2 - 4ac}}{2a} $$
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 等功能。例如:
注意:目前支持尚不完全,在印象笔记中勾选复选框是无效、不能同步的,所以必须在马克飞象中修改 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 天的试用期,试用期过后需要续费才能继续使用。未购买或者未及时续费,将不能同步新的笔记。之前保存过的笔记依然可以编辑。
感谢阅读这份帮助文档。请点击右上角,绑定印象笔记账号,开启全新的记录与分享体验吧。
[^demo]: 这是一个示例脚注。请查阅 MultiMarkdown 文档 关于脚注的说明。 限制: 印象笔记的笔记内容使用 ENML 格式,基于 HTML,但是不支持某些标签和属性,例如id,这就导致脚注
和TOC
无法正常点击。
@(示例笔记本)[马克飞象|帮助|Markdown]
马克飞象是一款专为印象笔记(Evernote)打造的Markdown编辑器,通过精心的设计与技术实现,配合印象笔记强大的存储和同步功能,带来前所未有的书写体验。特点概述:
我们理解您需要更便捷更高效的工具记录思想,整理笔记、知识,并将其中承载的价值传播给他人,Cmd Markdown 是我们给出的答案 —— 我们为记录思想和分享知识提供更专业的工具。 您可以使用 Cmd Markdown:
整理知识,学习笔记 发布日记,杂文,所见所想 撰写发布技术文稿(代码支持) 撰写发布学术论文(LaTeX 公式支持)
除了您现在看到的这个 Cmd Markdown 在线版本,您还可以前往以下网址下载:
请保留此份 Cmd Markdown 的欢迎稿兼使用说明,如需撰写新稿件,点击顶部工具栏右侧的 新文稿 或者使用快捷键
Ctrl+Alt+N
。
Markdown 是一种方便记忆、书写的纯文本标记语言,用户可以使用这些标记符号以最小的输入代价生成极富表现力的文档:譬如您正在阅读的这份文档。它使用简单的符号标记不同的标题,分割不同的段落,粗体 或者 斜体 某些文字,更棒的是,它还可以
$$E=mc^2$$
1
2
3
4
5
6
7
@requires_authorization
class SomeClass:
pass
if __name__ == '__main__':
# A comment
print 'hello world'
1
st=>start: Start op=>operation: Your Operation cond=>condition: Yes or No? e=>end 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!
想要查看更详细的语法说明,可以参考我们准备的 Cmd Markdown 简明语法手册,进阶用户可以参考 Cmd Markdown 高阶语法手册 了解更多高级功能。
总而言之,不同于其它 所见即所得 的编辑器:你只需使用键盘专注于书写文本内容,就可以生成印刷级的排版格式,省却在键盘和工具栏之间来回切换,调整内容和格式的麻烦。Markdown 在流畅的书写和印刷级的阅读体验之间找到了平衡。 目前它已经成为世界上最大的技术分享网站 GitHub 和 技术问答网站 StackOverFlow 的御用书写格式。
您可以使用很多工具书写 Markdown,但是 Cmd Markdown 是这个星球上我们已知的、最好的 Markdown 工具——没有之一 :)因为深信文字的力量,所以我们和你一样,对流畅书写,分享思想和知识,以及阅读体验有极致的追求,我们把对于这些诉求的回应整合在 Cmd Markdown,并且一次,两次,三次,乃至无数次地提升这个工具的体验,最终将它演化成一个 编辑/发布/阅读 Markdown 的在线平台——您可以在任何地方,任何系统/设备上管理这里的文字。
我们将 Cmd Markdown 的主界面一分为二,左边为编辑区,右边为预览区,在编辑区的操作会实时地渲染到预览区方便查看最终的版面效果,并且如果你在其中一个区拖动滚动条,我们有一个巧妙的算法把另一个区的滚动条同步到等价的位置,超酷!
也许您还是一个 Markdown 语法的新手,在您完全熟悉它之前,我们在 编辑区 的顶部放置了一个如下图所示的工具栏,您可以使用鼠标在工具栏上调整格式,不过我们仍旧鼓励你使用键盘标记格式,提高书写的流畅度。
完全心无旁骛的方式编辑文字:点击 编辑工具栏 最右测的拉伸按钮或者按下 Ctrl + M
,将 Cmd Markdown 切换到独立的编辑模式,这是一个极度简洁的写作环境,所有可能会引起分心的元素都已经被挪除,超清爽!
为了保障数据安全,Cmd Markdown 会将您每一次击键的内容保存至云端,同时在 编辑工具栏 的最右侧提示 已保存
的字样。无需担心浏览器崩溃,机器掉电或者地震,海啸——在编辑的过程中随时关闭浏览器或者机器,下一次回到 Cmd Markdown 的时候继续写作。
在网络环境不稳定的情况下记录文字一样很安全!在您写作的时候,如果电脑突然失去网络连接,Cmd Markdown 会智能切换至离线模式,将您后续键入的文字保存在本地,直到网络恢复再将他们传送至云端,即使在网络恢复前关闭浏览器或者电脑,一样没有问题,等到下次开启 Cmd Markdown 的时候,她会提醒您将离线保存的文字传送至云端。简而言之,我们尽最大的努力保障您文字的安全。
为了便于管理您的文稿,在 预览区 的顶部放置了如下所示的 管理工具栏:
通过管理工具栏可以:
发布:将当前的文稿生成固定链接,在网络上发布,分享
新建:开始撰写一篇新的文稿
删除:删除当前的文稿
导出:将当前的文稿转化为 Markdown 文本或者 Html 格式,并导出到本地
列表:所有新增和过往的文稿都可以在这里查看、操作
模式:切换 普通/Vim/Emacs 编辑模式
通过 预览区 右上角的 阅读工具栏,可以查看当前文稿的目录并增强阅读体验。
工具栏上的五个图标依次为:
目录:快速导航当前文稿的目录结构以跳转到感兴趣的段落
视图:互换左边编辑区和右边预览区的位置
主题:内置了黑白两种模式的主题,试试 黑色主题,超炫!
阅读:心无旁骛的阅读模式提供超一流的阅读体验
全屏:简洁,简洁,再简洁,一个完全沉浸式的写作和阅读环境
在 阅读工具栏 点击 或者按下 Ctrl+Alt+M
随即进入独立的阅读模式界面,我们在版面渲染上的每一个细节:字体,字号,行间距,前背景色都倾注了大量的时间,努力提升阅读的体验和品质。
在编辑区任意行首位置输入以下格式的文字可以标签当前文档:
标签: 未分类
标签以后的文稿在【文件列表】(Ctrl+Alt+F)里会按照标签分类,用户可以同时使用键盘或者鼠标浏览查看,或者在【文件列表】的搜索文本框内搜索标题关键字过滤文稿,如下图所示:
在您使用 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:
]]>整理知识,学习笔记 发布日记,杂文,所见所想 撰写发布技术文稿(代码支持) 撰写发布学术论文(LaTeX 公式支持)
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
android:alwaysRetainTaskState
android:clearTaskOnLanunch
android:configChanges
android:enabled
android:excludeFromRecents
android:exported
android:finishOnTaskLaunch
android:launchMode
android:multiprocess
android:name
activity的类名, 必须指定
android:onHistory
android:process
android:screenOrientation
activity显示的模式, “unspecified” 默认值 “landscape” 风景画模式,宽度比高度大一些 “portrait” 肖像模式, 高度比宽度大。 “user” 用户的设置 “behind” “sensor” “nosensor”
android:stateNotNeeded
是否 activity被销毁和成功重启并不保存状态
android:taskAffinity
activity的亲属关系, 默认情况同一个应用程序下的activity有相同的关系
android:theme
android:windowSoftInputMode
activity主窗口与软键盘的交互模式, 自从API level 3 被引入
转载自:http://www.cnblogs.com/xilinch/archive/2012/07/17/2595613.html
]]>android:allowTaskReparenting
是否可以将目标activity从启动它的那个Task移动到他自己定义的而且马上要显示的那个Task.如果为false,它就会留在启动它的那个Task中.
]]>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]与
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>
作用:列举出所有包含
举例:adb shell pm list packages com.lt
说明:[options]与
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]与