2016年11月24日
Is Android direct texture supported on imx6q?
http://www.slideshare.net/GlobalLogicUkraine/direct-access-to-open-gl-texture-memory-33606538
http://www.eoeandroid.com/thread-326092-1-1.html?_dsign=3b421428
http://stackoverflow.com/questions/22383533/memcpy-from-graphic-buffer-is-slow-in-android%E3%80%82
http://stackoverflow.com/questions/27426823/creating-a-mapped-direct-opengl-es-texture-on-android-ndk
2016年11月22日
ANDROID中的EGL扩展
using direct textures on android
EGLImage - updating a texture without copying memory under Android
android 下使用Direct Texture
EGLImage与纹理
OpenGL ES 3.0 让移动世界更上一层楼
Using GL_OES_EGL_image_external on Android
2016年11月19日
PBO + glReadPixels not so fast? 没有结论,但至少知道正确姿势
OpenGL ES3 接口文档
Fast Pixel Transfers with Pixel Buffer Objects
Reading the OpenGL backbuffer to system memory
Faster Alternatives to glReadPixels and glTexImage2D in OpenGL ES
OpenGL系列教程之九:OpenGL像素缓冲区对象(PBO)
翻译自一个蛮不错的系列
OpenGL离线渲染和缓冲区对象
2016年10月23日
解决:Dialog、AlertDialog、DialogFragment等自定义布局中EditText无法弹出输入法软键盘的问题
http://www.jianshu.com/p/85aa47d46065
注:DialogFragment没有onShowListener,Dialog才有
android:windowSoftInputMode属性详解
http://blog.csdn.net/gaomatrix/article/details/7057032
注:软键盘强制弹出需要这个属性的配合
使用DialogFragment实现底部弹窗布局
http://www.jianshu.com/p/3d045ee00880
注:核心是将Fragment所属的Windows的
LayoutParams.gravity
值改为Gravity.BOTTOM
// 设置宽度为屏宽, 靠近屏幕底部。
Window window = dialog.getWindow();
WindowManager.LayoutParams lp = window.getAttributes();
lp.gravity = Gravity.BOTTOM; // 紧贴底部
lp.width = WindowManager.LayoutParams.MATCH_PARENT; // 宽度持平
window.setAttributes(lp);
[Android] Material 风格的 Dialog 的使用
http://www.jianshu.com/p/6caffdbcd5db
使用官方兼容包,来保证默认dialog风格一致,同时不丑
2016年10月10日
首先要理解Git的工作流程,最基础的操作就不说了,重点在于Git的分支管理,参见《Pro Git》的第三章 Git 分支一章。
如果项目中不幸使用的不是Git,难道就不能领略Git的灵活性了吗?可以使用git svn
工具,参见 Git与其他系统-作为客户端的Git
还有文中没提到的git svn
的命令:git与SVN协同的工作流程
2016年10月07日
深入理解Gradle: http://www.infoq.com/cn/articles/android-in-depth-gradle
2016年10月07日
Fresco: http://www.fresco-cn.org
TextView部分文字点击事件: http://blog.csdn.net/true100/article/details/44855731
2016年09月30日
Jack (Java Android Compiler Kit)
似乎现在还没有普遍用起来这个工具。理论上是向后兼容的,打出来的包也能够在低版本下运行。
2016-09-26
Android单元测试研究与实践
2016-09-21
2016-09-20
Python格式化输出
占位符 | 含义 |
---|---|
%x | hex 十六进制 |
%d | dec 十进制 |
%o | oct 八进制 |
参考资料
2016-09-19
统计类库的方法数
Android Studio 插件
在线网站
参考资料
2016-09-14
学习Cap'n proto
学习Cap'n proto
Cap'n proto 官网
Cap'n Proto for Java
FlatBuffers 体验
Google Protocol Buffer 的使用和原理
Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,很适合做数据存储或 RPC 数据交换格式。它可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。目前提供了 C++、Java、Python 三种语言的 API。
参考资料
Google Protocol Buffer 的使用和原理
Google Protocol Buffer Java教程
[译]Protobuf 语法指南
设计一种简化的 protocol buffer 协议
2016-09-13
动态开启系统组件的方法
/**
* 批量禁用组件
* @param context 上下文
* @param components service、receiver组件的完整类名
* @return 本次是否有组件的状态被变更
*/
public static boolean disableComponents(Context context, String[] components) {
PackageManager pm = context.getPackageManager();
boolean hasChange = false;
for (String component : components) {
ComponentName componentName = new ComponentName(context, component);
// enabled=true的时候,改为禁用
if (pm.getComponentEnabledSetting(componentName) != PackageManager.COMPONENT_ENABLED_STATE_DISABLED) {
pm.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
hasChange = true;
LogUtils.d(TAG, "disable component: " + componentName);
}
}
return hasChange;
}
/**
* 批量禁用组件
* @param context 上下文
* @param components service、receiver组件的完整类名
* @return 本次是否有组件的状态被变更
*/
public static boolean enableComponents(Context context, String[] components) {
PackageManager pm = context.getPackageManager();
boolean hasChange = false;
for (String component : components) {
ComponentName componentName = new ComponentName(context, component);
// enabled=false的时候,改为启用
if (pm.getComponentEnabledSetting(componentName) != PackageManager.COMPONENT_ENABLED_STATE_ENABLED) {
pm.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
hasChange = true;
LogUtils.d(TAG, "enable component: " + componentName);
}
}
return hasChange;
}
通过代码动态启用/关闭,即便应用被杀配置也依旧生效。目测系统内部维持了一个记录表,后续研究下。
参考资料
Enable and disable a Broadcast Receiver
PackageManager
2016-09-12
Android手机如何录制屏幕及转GIF
Android Studio提示svn版本过旧
使用SmartSvn的时候,svn目录被升级到了1.9格式,而Android Studio最高只支持1.8
升级本地的svn命令到1.9版本,然后修改Android Studio的配置,如下:
Gradle根据buildType配置依赖
// build.gradle
android {
buildTypes {
...
custom {
...
}
}
}
dependencies {
customCompile fileTree(dir: 'custom/libs', include: '*.jar')
}
记得android
的block要在dependencies
前面,否则Gradle会报错,提示找不到customCompile
这个DSL方法
2016-09-06
第三方依赖minSdkVersion高于项目的minSdkVersion导致项目编译不过
在AndroidManifest.xml
内的<use-sdk>
标签内添加tools:overrideLibrary="包名"
如:
<use-sdk tools:overrideLibrary="第三方依赖的名字" />
2016-09-05
构建服务器提示构建脚本错误:$'\r': command not found
Windows下的文件格式采用\n\r
换行,Unix下采用\n
换行,导致Linux构建服务器上运行脚本的时候在行开始发现了不支持的命令'\r'。
使用dos2unix
命令将文件的格式转为unix格式即可。
# Usage
dos2unix build.sh
自定义shape背景透明要显式指定color为透明
自定义shape时,如果不需要底色,一般会省略<solid />
的定义,在大部分系统上,这个时候是没有底色的,即透明效果。但在某些rom,如小米2A,会出现系统给的默认底色是黑色,导致视觉还原出问题。
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<!-- 圆角 -->
<corners android:radius="1dp" />
<!-- 底色,这里要显式指定为透明 -->
<solid android:color="@color/kg_color_transparent" />
<!-- 高度 -->
<size android:height="12dp"/>
<!-- 边线 -->
<stroke android:width="1dp" android:color="#7d98a9" />
<!-- 内边距 -->
<padding android:left="2dp" android:right="2dp" />
</shape>
2016-09-02
动画效果
xml方式定义
<animation-list android:id="@+id/selected" android:oneshot="false">
<item android:drawable="@drawable/wheel0" android:duration="50" />
<item android:drawable="@drawable/wheel1" android:duration="50" />
<item android:drawable="@drawable/wheel2" android:duration="50" />
<item android:drawable="@drawable/wheel3" android:duration="50" />
<item android:drawable="@drawable/wheel4" android:duration="50" />
<item android:drawable="@drawable/wheel5" android:duration="50" />
</animation-list>
oneshot
:true则只播放一次,false则表示联系播放
<item>
:定义一帧动画,属性drawable
指定这一帧对应的图片,duration
指定这一帧的播放时长(ms)
代码方式
Drawable[] loadingDrawables = new Drawable[] {
Global.getResources().getDrawable(R.id.wheel0),
Global.getResources().getDrawable(R.id.wheel1),
Global.getResources().getDrawable(R.id.wheel2),
Global.getResources().getDrawable(R.id.wheel3),
Global.getResources().getDrawable(R.id.wheel4),
Global.getResources().getDrawable(R.id.wheel5)
};
AnimationDrawable animationDrawable = new AnimationDrawable();
for (Drawable frame : loadingDrawables) {
animationDrawable.addFrame(frame, 50);
}
播放和停止
ImageView img = (ImageView)findViewById(R.id.spinning_wheel_image);
img.setBackgroundResource(R.drawable.spin_animation);
// 代码定义的方式
// img.setBackgroundDrawable(animationDrawable);
// 获取背景,xml定义的会编译为AnimationDrawable 对象
AnimationDrawable frameAnimation = (AnimationDrawable) img.getBackground();
// 启动播放,默认是循环播放
frameAnimation.start();
// 停止播放
frame.Animation.stop();
参考资料
2016-09-01
动态加载dex文件
2.3系统无法直接加载dex文件,仅支持加载zip格式的dex包,为了保证兼容,必须将dex文件改名为classes.dex
,在压缩成zip格式的压缩包。