投资/理财/金钱 最宝贵的金融资产就是赚钱的本领 财富阅读 这天学到了 这天记账了么 这天的思考 梦想/创意/灵感/成绩/错误 建立灯塔与修正方向的地方 今天我要尝试的是 做本月总结 灵感涂鸭 昨天的进步是 昨天的不足是 每天向前走一步,Think Big Do Small 成功五事 自信积极,积累成功 昨天最成功的五件事 成功在哪里/一些感言 我的一天·创意人生 助人助己,追求卓越 财富 时间 思维 感悟和收获 日历 鼠年x岁 天气 什么日子 生日 纪念日 命运日 相遇日 起床时间 睡觉日间 体重 体温 心情 亲人爱人友人-五件小事 越是持久的关系,越需要不断的储蓄 特殊的人 朋友们 家人 昨天的情感收获 健康一生·坚持为胜 睡眠·饮食·锻炼 生理周期 身体异样 锻炼项目 排便 饮食 对身体的关注和健康的理解 学无止境·参悟一生 每周阅读一轮回,每天阅读两小时 社会·环境 个体·发展 文化·兴趣 其一·它二 体会感悟 专业关注 博大精深我在其中 专业关注一 专业关注二 专业关注三 其一·它二 体会感悟
最后更新时间 2016-07-05 已移动到github,欢迎star. github地址
对于一名Android攻城狮来说,学会翻墙基本已经是必不可少本领。不翻墙怎么看最新的官方文档,怎么访问Google,怎么更新sdk,怎么下开发工具。。。。。那么下面就来说聊聊如何拆墙。 乖孩子型 我是个乖孩子。不想做这么胆肥的事情。下面就有直接现有的资源,拿来直接用。 Android devtools Android devtools包含了很多的下载资源,其中包括android studio、adteclipse、sdk各种资源、以及一些日常的开发工具,包括一些sdk更新的镜像。只有你想不到真的是很丰富。 使用镜像更新SDK 打开上面的网站你就会发现有很多镜像服务器的地址,那如何使用镜像来更新。举个例子 假设我的镜像地址是 1 2 ubuntu.buct.edu.cn 端口 80 ubuntu.buct.cn 端口 80 配置镜像 打开sdk更新界面,HttP Proxy Server表示是代理服务器,就输入ubuntu.buct.edu.cn。HTTP proxy port是代理端口,输入80即可。 输入完成后,重写reload即可。如没用可尝试clear cache。 土豪孩子型 土豪孩子都不差钱,花钱买个vpn呗(这点投入还是要的)。市场上的Vpn也是五花八门。说句心里话好用才是王道。下面列举吉几款。大家自己挑选使用。 51vpn 地址:https://www.woyaovpn.net/index.shtml 云梯 地址:https://www.cloudtizi.com/ GrenenVpn 地址:http://www.xiyouvpn.com/zhtc/ 筋斗云 地址:http://www.jdyvpn.com.cn/ 懵逼孩子型 翻个墙咋这么麻烦捏.要不试试下面这个? 蓝灯:https://github.com/getlantern/lantern/ 据说是google参与研发的,应该靠谱哈。 不走寻常路 按理写到这里结束了。但是还有种拆墙的方法。就是自己搭建vps,然后使用pptp协议来做代理.这里就不列举啦。有兴趣自己研究一下了哈。 end。。。。。。。
收集Mac常用快捷键。掌握这些快捷键,势必事半功倍的效果 快捷键 快捷键的符号所对应的按键 ⌥—> option|alt ⇧—>shift ⌃—>control ⌘—>command ⎋—>esc 常用快捷键 更多补充 1 2 3 cmd+方向键上 #返回向一级文件夹 cmd+方向键 #进入下一级文件夹 cmd+alt+v #将文件复制并移动 文本位置跳转快捷键: 1 2 3 4 5 6 跳转到一行的开头:Command+左箭头 跳转到一行的末尾:Command+右箭头 跳转到当前单词的开头(适合英文、拼音):Option+左箭头 跳转到当前单词的末尾(适合英文、拼音):Option+右箭头 跳转到全部文本的开头:Command+上箭头 跳转到全部文本的末尾:Command+下箭头 在以上快捷键中加入Shift,则可以扩展成为选中文本效果的快捷键: 1 2 3 4 5 6 选中光标到本行开头的文本:Shift+Command+左箭头 选中光标到本行末尾的文本:Shift+Command+右箭头 选中光标到当前单词的开头(适合英文、拼音):Shift+Option+左箭头 选中光标到当前单词的末尾(适合英文、拼音):Shift+Option+右箭头 选中光标到全部文本的开头:Shift+Command+上箭头 选中光标到全部文本的末尾:Shift+Command+下箭头
番外篇 首先我们先了解位图和矢量图的区别 位图 位图使用我们称为像素的一格一格的小点来描述图像.计算机屏幕其实就是一张包含大量像素点的网格.在位图中,平时看到的图像将会由每一个网格中的像素点的位置和色彩值来决定.每一点的色彩是固定的,当我们在更高分辨率下观看图像时,每一个小点看上去就像是一个个马赛克色块.当图像放大后,边缘变得模糊不清.位图图像的清晰度取决于图像大小与分辨率 矢量图 矢量图使用线段和曲线描述图像,所以称为矢量,同时图形也包含了色彩和位置信息.当您进行矢量图形的编辑时,您定义的是描述图形形状的线和曲线的属性,这些属性将被记录下来.对矢量图形的操作,例如移动,重新定义尺寸,重新定义形状,或者改变矢量图形的色彩,都不会改变矢量图形的显示品质.您也可以通过矢量对象的交叠,使得图形的某一部分被隐藏,或者改变对象的透明度.矢量图形是”分辨率独立”的,这就是说,当您显示或输出图像时,图像的品质不受设备的分辨率的影响. BitMap和内存的关系 说到内存就会想到内存溢出。内存溢出就是分配的内存不足以放下数据项序列。如在一个域中输入的数据超过了它的要求就会系统能给你的,系统不能满足需求,于是产生溢出。或者可以这样理解堆上分配的内存没有被释放,从而失去对其控制。这样会造成程序能使用的内存越来越少,导致系统运行速度减慢,严重情况会使程序宕掉。 在日常开发中影响位图的占用大小的几个关键点: 1 2 3 1.图片长度 2.图片宽度 3.每个像素所占的字节(Bitmap的RGB值) BitMap的的计算公式为: 一张图片(BitMap)占用的内存=图片长度图片宽度单位像素占用的字节数 详解介绍如何计算Bitmap内存占用 注意: Bitmap的占用空间大小和目标文件的大小无关,主要是图片的长和宽。 Bitmap内存优化 上面说了这么多基本的概念和原理。下面就来看看实战中应该如果避免内存溢出。 1.及时释放内存 1.为什么要及时回收Bitmap的内存 Android系统有自己的垃圾回收机制,可以不定期的回收掉不使用的内存空间,当然也包括Bitmap的空间。那为什么还需要这个方法呢?Bitmap类的构造方法都是私有的,,只能通过BitmapFactory类的来实例化一个Bitmap。仔细查BitmapFactory的源代码可以看到,生成Bitmap对象最终都是通过JNI调用方式实现的。所以,加载Bitmap到内存里以后,是包含两部分内存区域的。简单的说,一部分是Java部分的,一部分是C部分的。这个Bitmap对象是由Java部分分配的,不用的时候系统就会自动回收了,但是那个对应的C可用的内存区域,虚拟机是不能直接回收的,这个只能调用底层的功能释放。所以需要调用recycle()方法来释放C部分的内存。从Bitmap类的源代码也可以看到,recycle()方法里也的确是调用了JNI方法了。 那如果不调用recycle(),是否就一定存在内存泄露呢?也不是的。Android的每个应用都运行在独立的进程里,有着独立的内存,如果整个进程被应用本身或者系统杀死了,内存也就都被释放掉了,当然也包括C部分的内存。 2.手动释放内存 下面是释放Bitmap的示例代码片段。 1 2 3 4 5 6 7 8 9 //在Activity或Fragment的onDestory方法中进行回收(必须确保bitmap不在使用) public void onDestory(){ // 先判断是否已经回收 if(bitmap != null && !bitmap.isRecycled()){ // 回收并且置为null bitmap.recycle(); bitmap = null; } } 2.进行图片压缩 如果我在开始的时候加载一张很大的图,直接超过了分配的内存大小,那也会引起内存溢出。这个时候我们就需要对加载的BitMap的大小进行控制,这个时候就需要用到图片压缩。 图片压缩比较靠谱的几种办法 3.捕获异常 在Android系统里,读取位图Bitmap时,分给虚拟机中的图片的堆栈大只有8M,为了避免应用在分配Bitmap内存的时候出现OutOfMemory异常以后Crash掉,所以在实例化Bitmap的代码中,一定要对OutOfMemory异常进行捕获。 以下是代码示例。 1 2 3 4 5 6 7 Bitmap bitmap = null; try { // 实例化Bitmap bitmap = BitmapFactory.decodeFile(path); } catch (OutOfMemoryError e) { // } 这里对初始化Bitmap对象过程中可能发生的OutOfMemory异常进行了捕获。如果发生了OutOfMemory异常,应用不会崩溃,而是得到了一个默认的Bitmap图。 经验分享: 很多开发者会习惯性的在代码中直接捕获Exception。但是对于OutOfMemoryError来说,这样做是捕获不到的。因为OutOfMemoryError是一种Error,而不是Exception。在此仅仅做一下提醒,避免写错代码而捕获不到OutOfMemoryError。
我们看到HandlerThread很快就会联想到Handler。Android中Handler的使用,一般都在UI主线程中执行,因此在Handler接收消息后,处理消息时,不能做一些很耗时的操作,否则将出现ANR错误。Android中专门提供了HandlerThread类,来解决该类问题。HandlerThread类是一个线程专门处理Hanlder的消息,依次从Handler的队列中获取信息,逐个进行处理,保证安全,不会出现混乱引发的异常。HandlerThread继承于Thread,所以它本质就是个Thread。与普通Thread的差别就在于,它有个Looper成员变量。 简介 看看官方的对他的讲解 Handy class for starting a new thread that has a looper. The looper can then be used to create handler classes. Note that start() must still be called. 大致意思就是说HandlerThread可以创建一个带有looper的线程。looper对象可以用于创建Handler类来进行来进行调度。 接下来看看HandlerThread的源码 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 package android.os; public class HandlerThread extends Thread { int mPriority; int mTid = -1; Looper mLooper; public HandlerThread(String name) { super(name); mPriority = Process.THREAD_PRIORITY_DEFAULT; } protected void onLooperPrepared() { } @Override public void run() { mTid = Process.myTid(); Looper.prepare(); synchronized (this) { mLooper = Looper.myLooper(); notifyAll(); } Process.setThreadPriority(mPriority); onLooperPrepared(); Looper.loop(); mTid = -1; } 线程run()方法当中先调用Looper.prepare()初始化Looper,最后调用Looper.loop(),这样我们就在该线程当中创建好Looper。(注意:Looper.loop()方法默认是死循环).prepare()呢。 Handler原理 要理解Handler的原理,理解如下几个概念即可茅塞顿开。 Message 意为消息,发送到Handler进行处理的对象,携带描述信息和任意数据。 MessageQueue 意为消息队列,Message的集合。 Looper 有着一个很难听的中文名字,消息泵,用来从MessageQueue中抽取Message,发送给Handler进行处理。 Handler 处理Looper抽取出来的Message。 Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系 用法 1 2 3 HandlerThread thread = newHandlerThread("handler_thread"); thread.start();//必须要调用start方法 final Handlerhandler = newHandler(thread.getLooper()){ 其他api 1 2 3 4 5 6 7 8 //用于返回与该线程相关联的Looper对象 thread.getLooper(); //获得该线程的Id thread.getThreadId(); //结束当前的Looper 循环。 thread.quit(); //用于looper取出的消息处理 thread.run(); 实例 效果图 在以上效果图中可以看到当我点击按钮之后,两个蓝色的方块变成了图片。在按钮点击事件中我添加了两个下载图片的任务(模拟情况下),并在加载完后替换控件的默认图片。很明显很可以看到是有先后顺序的。在第一张图片加载完后第二张图片才会显示。 MainActivity 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 public class MainActivity extends AppCompatActivity { private HandlerThread handlerThread; private ImageView imageView,imageView1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); } private void init() { imageView= (ImageView) findViewById(R.id.imageView); imageView1= (ImageView) findViewById(R.id.imageView1); handlerThread = new HandlerThread("MainActivity"); handlerThread.start(); final Handler handler = new Handler(handlerThread.getLooper()); //点击download开始进行下载 findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { handler.post(new MyRunable(1)); handler.post(new MyRunable(2)); } }); } class MyRunable implements Runnable { int pos; public MyRunable(int pos) { this.pos = pos; } @Override public void run() { //模拟耗时 try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } if (pos == 1) { imageView.post(new Runnable() { @Override public void run() { imageView.setBackgroundResource(R.mipmap.ic_launcher); } }); } else { imageView.post(new Runnable() { @Override public void run() { imageView1.setBackgroundResource(R.mipmap.ic_launcher); } }); } } } @Override protected void onDestroy() { super.onDestroy(); handlerThread.quit();//停止Looper的循环 } } 布局文件 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 源码地址 https://github.com/Waylenw/AndroidBase 总结 HandlerThread适合在只需要在一个工作线程(非UI线程)+任务的等待队列的形式,优点是不会有堵塞,减少了对性能的消耗,缺点是不能同时进行多任务的处理,需要等待进行处理。处理效率较低。 感谢参考(更多详细) http://blog.csdn.net/lmj623565791/article/details/47079737 http://droidyue.com/blog/2015/11/08/make-use-of-handlerthread/?utm_source=tuicool&utm_medium=referral
日常开发中,我们避免不了去接触视频图像的展示,但在android屏幕分辨率碎片化如此严重的今天,难免会遇到图片拉伸以及视频拉伸的问题,那该如何解决呢?这就是今天的主题了。 首先看一个例子 布局文件 1 2 3 4 5 6 7 8 9 10 11 12 13 很简单就是在一个布局里面添加一个ImgeView的控件,让它充满屏幕。并给它设置一个背景. 效果图是这样 原图是这样的 是不是被拉伸了?为什么会出现这样的情况?因为这张图片的宽高是600:375。在宽和高不是等比拉伸的被强制拉伸到屏幕宽高的情况下就出现了这这种现象。如果我们以1080:1920的宽高来对比。宽大概拉伸了1.x呗而高却拉伸了6.x呗。所以肯定会产生拉伸的情况。 我们换一种方法看看,将图片设置为src。看看效果。 你会发现宽被撑满了,而高却没有撑满整个屏幕。这是为什么呢? 这个时候要扯入另一个概念了。在ImagView的onMeasure方法中首先会根据你设置控件的宽高来设置测量方式,由于我们设置的是match_parent所以此时的测量方式是宽和高不超过父窗口。也就是子布局的内容可以撑满到父控件的宽高(假设1080:1920)。那么既然测量宽高是屏幕宽高,为什么图片没有拉满整个屏幕。仔细研究你会发现,宽和高都是等比例的放大了,宽度大约放大了1.8倍,而高度遵循这个规则放大了1.8倍。然而放大1.8倍并没有拉伸到屏幕宽度。所以此时imgView的src属性在match_prarent属性下是做等比放大的。 那么问题来了,为什么不已宽度去拉伸了? 因为在View控件的onMeasure中计算好测量高度后都会调用setMeasuredDimension(heightMeasureSpec,heightMeasureSpec); 那此时widthMeasureSpec=1080 widthMeasureSpec=1920。如果我以长度为基础去拉伸到1920。然后以此拉伸的倍数去拉伸宽度。结果如下 1 2 3 原始宽高 放大后宽高 放大倍数 600 3072 5.x倍 375 1920 5.x倍 很明显如果我已长度为基准去拉伸,宽度必须要为3072图片才不是变形的。但是由于View控件在设置的测量宽度小于3072所以由于一边不满足拉伸的条件,所以只做最短拉伸倍数。 改造 通过上面的一系列研究。基本上明白了这个规则。接下就自己改造一套等比拉伸的ImgView. MainActivity 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 public class MainActivity extends AppCompatActivity { private MyFitImageView imageView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); imageView= (MyFitImageView) findViewById(R.id.ivImage); Bitmap bitmap=BitmapFactory.decodeResource(getResources(), R.drawable.timg); imageView.setImageBitmap(bitmap); imageView.setSize(bitmap.getWidth(),bitmap.getHeight()); } } MyFitImageView 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 public class MyFitImageView extends ImageView { private final String TAG="MainActivity"; private int screenWidth; private int screenHeight; private int displayWidth; private int displayHeight; public MyFitImageView(Context context) { this(context, null); } public MyFitImageView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public MyFitImageView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { screenWidth = SystemUtils.getDisplayWidth(getContext()); screenHeight = SystemUtils.getDisplayHeight(getContext()); } public void setSize(int bitmapWidth, int bitmapHeight) { displayWidth = screenWidth; displayHeight = screenHeight; //计算出按比例拉伸后的宽度和高度 displayWidth = screenHeight * bitmapWidth / bitmapHeight; displayHeight = screenWidth * bitmapHeight / bitmapWidth; //判断如果以图片高度拉伸到屏幕的高度,按照相应的拉伸比是否能够拉伸超过屏幕宽度或者等于屏幕宽度,否则以另一边为基准 if(displayWidth>=screenWidth){ displayHeight=screenHeight; }else{ displayWidth=screenWidth; } //TODO 拉伸后截取中间的部分 ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) getLayoutParams(); lp.leftMargin = (screenWidth - displayWidth) / 2; lp.topMargin = ((screenHeight - displayHeight) / 2); setLayoutParams(lp); Log.d(TAG, "screenWitdth" + screenWidth); Log.d(TAG, "screenHeight:" + screenHeight); Log.d(TAG, "fit width:" + displayWidth); Log.d(TAG, "fit height:" + displayHeight); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); setMeasuredDimension(displayWidth,displayHeight); } } 布局文件 1 2 3 4 5 6 7 8 9 10 11 12 效果图 是不是和ImageView的CenterCrop的效果一样呢。此方法还可以适用于视频适配。同样改造surfaceView重写onMeasure方法就可以了。 源码 源码地址
概述 本博客的所链接的文章不全是原创。很多是写的非常好的博客。所以本博客主要是收集Android开发教程优秀的博客。以下是推荐初学者学习和了解Android开发的的链接 推荐 Android学习之路 Android知识图谱 Android学习路线指南之从入门到高级 Android官方培训课程中文版 Android编码规范 系统架构 Android系统源码基础知识讲解 Android ART运行时相关 Android控件 Android主题和样式 Android控件属性大全 Anddroid WebView的讲解 Android TextView使用完全讲解 ListView的完全讲解 Android 自定义简单的圆形和水平的ProgressBar ImgView ScaceType详解 Android UI设计博客专栏 事件 Android ViewGroup事件分发 Android事件分发机制(上) Android事件分发机制(下) Android ViewGroup触摸事件的传递和拦截 View Android getWidth和getMeasuredWidth的正解 Android例子:根据需求自定义控件 Android Path类的使用 资源文件 Android Drawable之Shape使用小案例(一) Android Drawable资源完全讲解 Android颜色透明度对应的开头字母 Android xml资源文件中@、@android:type、@*、?、@+含义和区别 AndroidManifest.xml文件讲解 Android状态栏变色 Android 加载不同 DPI 资源与内存消耗间的关系 Android中图片大小、内存占用与drawable文件夹关系的研究与分析 四大组件 Activity Activity生命周期 Activity的启动模式 Activity界面切换动画讲解 Activity OnTrimMemory内存消耗 Activity 后台监听 Activity 电话监听 Activity 设置系统屏幕亮度 Activity 软键盘弹出效果完全讲解 Intent Android Intent调用系统操作 Android pendingIntent的使用和讲解 Android intent和PendingIntent的区别 Android启动多个后台任务预览视图 service Android Service生命周期及用法 IntentService的使用和讲解 Android service如何不被杀死 Broadcast receiver BroadCast内部机制讲解 Content provider 案例之Android读取手机短信 数据存储和网络请求 数据存储方式之Shareprefences Android存储路径完全讲解 Android SD卡存储容量相关讲解、 网络请求 Android访问https Android实现网络多线程断点续传下载 多线程 Handler讲解之基本使用(一) Handler讲解之sendMessage(二) Handler讲解之异步任务操作(三) HandlerThread使用总结 Loader的全面讲解及源码浅析 AysnTask基本使用介绍 AysnTask机制从源码角度讲解 AsyncTask的存在的缺陷 AsyncTask的验证 如何使用 volatile, synchronized, final 进行线程间通信 优化 Android 线程池的使用和讲解 线程优先级讲解 案例 Android计时和倒计时 多媒体 Android音频播放讲解 Android音频录制 Android视频录制 Android视频播放的三种方式 Android音乐播放模式切换-外放、听筒、耳机 Android MediaMetadataRetriever获得媒体信息 Android Loader获取本机所有图片(相册) 经验 Android相机开发那些坑 图形处理和动画 通过Hardware Layer提升Android动画性能 Android 帧动画 Android 图片拉伸适配的解决方法 权限和动作 权限和动作大全 自定义权限 软键盘输入法 软键盘遮挡问题 Android系统信息和安全机制 Android 获取设备硬件和系统信息 Android 系统CPU,RAM,ROM,SDCard,MAC等信息查询 Android Apk反编译 Android签名机制之—签名过程详解 性能优化 内存优化 Android内存泄露之Context篇(上) Android内存泄露之Context篇(下) 优化合集 Android Handler内存泄露优化 Android Bitmap内存优化 Android应用开发性能优化完全分析 Android布局优化总结 Android性能优化(魅族资深工程师) Android内存优化之OOM(胡凯) Android性能优化典范(一) Android性能优化典范(二) Android性能优化典范(三) Android性能优化典范(四) Android管理应用的内存 依赖注入框架性能对比 性能优化工具 MAT使用入门 Android 通过trace文件分析死锁ANR Android性能调优利器StrictMode Android布局层级检测之HierarchyViewer Android性能调试工具之TraceView Anroid内存泄漏检测工具之LeakCanary Anroid性能监控工具之Blockcanary 开发工具 Android studio使用教程 Android 15个必知的Android开发者选项 这些小工具让你的Android 开发更高效 开源框架 RxJava 给Android开发的RxJava详解 RxJava在正确的线程上运行 React-native 进阶篇 适配和兼容 Android屏幕适配全攻略 Android SDK版本和兼容包讲解 应用构建 Android 应用方法数不能超过65K的问题 Android Log最佳实践 实战 架构设计 实战解析Android架构设计原则 《App研发录》落地之项目架构以及管理 面向对象六大原则 开发经验 Android开发中一些被冷落但却很有用的类和方法 开发前你需要知道的六件事 Android开发最佳实践 Android开发经验谈 如何更新SDK? 学习资源 Android google开发者频道(Youtube) Android gooogle中文开发者频道(Youtube ) 课外了解 友盟指数查看当前手机品牌占比和系统版本占比 Android国内的APP现状 关于App程序员泡沫 Android 更换Open JDK
简介和准备 相信大家对RecyclerView都不陌生了。自RecyclerView的出现开始,它就慢慢占据了我们日常开发使用的频率。所以掌握它就显得格外重要了。ReclclerView将各个模块的操作进行了拆解。很好的解决耦合问题。正是因为这种解耦让你做的事情更多,也更强大。逻辑也格外的清晰。 RecyclerView是Support-V7架包中得一个组件。所以在使用前必须先升级support lib,然后导入support-v7。 实例 首先在build.gradle文件添加依赖库 1 2 3 4 dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') compile 'com.android.support:recyclerview-v7:23.1.0' } MainAcvtivity 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 public class MainActivity extends Activity { private GridVeiwAdapter gridAdapter; private ListViewAdapter listAdapter; private FlowViewAdapter flowViewAdapter; private RecyclerView recyclerView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } private void initView() { recyclerView = (RecyclerView) findViewById(R.id.main_recyclerView); gridAdapter = new GridVeiwAdapter(getApplication()); listAdapter = new ListViewAdapter(getApplication()); flowViewAdapter = new FlowViewAdapter(getApplication()); TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs); tabLayout.setTabMode(TabLayout.MODE_FIXED); tabLayout.addTab(tabLayout.newTab().setText("ListView效果")); tabLayout.addTab(tabLayout.newTab().setText("GridView效果")); tabLayout.addTab(tabLayout.newTab().setText("Flow效果")); tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @Override public void onTabSelected(TabLayout.Tab tab) { if (tab.getPosition() == 0) {//ListView效果 recyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this)); recyclerView.setAdapter(listAdapter); } if (tab.getPosition() == 1) {//GridView效果 recyclerView.setLayoutManager(new GridLayoutManager(MainActivity.this, 3)); recyclerView.setAdapter(gridAdapter); } if (tab.getPosition() == 2) {//Flow效果 //StaggeredGridLayoutManager.VERTICAL此处表示有多少列 recyclerView.setLayoutManager(new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL)); recyclerView.setAdapter(flowViewAdapter); } } @Override public void onTabUnselected(TabLayout.Tab tab) { } @Override public void onTabReselected(TabLayout.Tab tab) { } }); recyclerView.setLayoutManager(new LinearLayoutManager(this)); recyclerView.setAdapter(listAdapter); } } setLayoutManager() 该方法是给每个Item设置一个布局管理器。有三种布局布局管理器 LinearLayoutManager线性布局管理器 GridLayoutManager网格布局管理器 StaggeredGridLayoutManager瀑布网格布局管理器 使用上面的布局管理器可以很轻松的实现ListView和GriView以及瀑布流的效果。既然这么吊还用ListView和GridView吗! FlowViewAdapter 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 public class ListViewAdapter extends RecyclerView.Adapter { List list=new ArrayList(); private Context context; public ListViewAdapter(Context context){ for(int i=0;i 基本上就这些了。有些Apdater的代码没有贴出来,大家可以去源代码中去查看 源码地址 效果图 基本效果就是这样了,三个按钮分别对应三个Adpater.只需一个控件即可实现ListView和GridView和瀑布流的效果
Android开发的童鞋们都知道,Google的碎片化是很严重的,所以官方提供了兼容包去试配一些低版本的机器。并且兼容包也在更新,除此之外,Android的SDK版本更新也十分的快速,基本上是一年发一个大的版本号。而且Api的变更也十分大,但是很多时候对这些变更感到无从下手。以下链接的这篇文章对SDK版本更新的内容都会有一个汇总。相信你可以很快熟悉各版本之间的差异。 SDK版本相关 官方SDK版本Api变动列表:(6.0为例) Android API Level所有版本列表 4.X Android 4.1 API官方文档详解 5.X Android 5.0 Api的变化 Android 5.0 camera2Api的使用 Android Palette取色器 VectorDrawable与SVG Android5.x新API介绍(一) Android5.x新API介绍(二) 6.X Android 6.0 中新的新技术 Android 6.0的变化 运行时权限开发者需要知道的一切 兼容库相关 兼容库和兼容包是什么?兼容库和兼容包是对Android一些更低版本实现高版本的功能所 提供的兼容架包。 官方Support Library版本更新汇总 Support-V4 在项目中引入 1 compile ('com.android.support:support-v4:13.0.0') NestedScrolling 实战:(5.0加入) Support-V7 Android RecyclerView三部曲之基础篇(一) Android Design Support Library NavigationView的实用讲解 TabLayout的使用讲解 百分比库 Android 百分比布局库(percent-support-lib) 解析与扩展
Eclipse转到Android Stuido感受最明显的就是buid速度变慢了,对与一些项目庞大一点的的项目稍微改动一两行代码就要buid一分多钟,改动大一点往3分多钟去了。这样太影响开发效率。怎么办?换SSD?别急你可以先试试以下的方法 配置多线程编译 在下面的目录下面创建gradle.properties文件: 1 2 3 /home//.gradle/ (Linux) /Users//.gradle/ (Mac) C:\Users\\.gradle (Windows) gradle.properties 1 2 3 org.gradle.daemon=true #开启gradle单独的守护进程 org.gradle.parallel=true org.gradle.jvmargs=-Xmx1024m #增大gradle运行的java虚拟机的大小 同时上面的这些参数也可以配置到前面的用户目录下的gradle.properties文件里,那样就不是针对一个项目生效,而是针对所有项目生效。 升级Gradle 2.4 Gradle 2.4对执行性能有很大的优化,但Android Studio现在默认使用的是Gradle 2.2, 所以我们需要手动让Android Studio使用Gradle 2.4,在项目根目录下的 build.grade中加入 1 2 3 task wrapper(type: Wrapper) { gradleVersion = '2.4' } 然后打开终端执行 ./gradlew wrapper,就可以下载Gradle 2.4了,下载完成后,我们需要在 Android Studio让我们的项目使用Gradle 2.4 离线加载 在不需要加载新的Jencter架包时可以使用离线加载 打开dex增量编译 这还是一个实验性的功能,但是还是推荐打开试试 在项目主Module下的build.grade中加入 1 2 3 dexOptions { incremental true } 以上配置完了,是不是明显快了很多。 感谢参考 https://www.aswifter.com/2015/06/14/boost-android-studio/ http://my.oschina.net/sammy1990/blog/388846
不定时更新 Markdown编写 Cmd Markdown 支持三大平台,对代码有高亮效果。支持云同步 Mou Mac下比较优秀的Markdown编写工具。(貌似1.0开始就要付费了) atom 有更好的代码高亮以及md语法的显示效果。能对多个md文件进行管理。 Android开发 Toal Control 电脑控制手机。支持安卓多个版本。目前好像只有win版本 licecap 轻量级的录屏软件。有windows和osx的版本 Mac Go2Shell 在Finder中进入到终端的神器 oppenoffice Apache下免费的office软件。支持跨平台 Alfred Alfred是Mac下的搜索神器 appcleaner mac下卸载App。并支持搜索该软件创建的文件。 chorme插件 chrome你不得不知的实用技巧 Vyor 电脑操作手机,只支持安卓。目前只是beta xmarks 书签工具。国内使用chrome的同步书签不错的选择,轻巧实用。
概述 官方APi的描述 SurfaceView是视图(View)的继承类,这个视图里内嵌了一个专门用于绘制的Surface。你可以控制这个Surface的格式和尺寸。Surfaceview控制这个Surface的绘制位置。surface是纵深排序(Z-ordered)的,这表明它总在自己所在窗口的后面。surfaceview提供了一个可见区域,只有在这个可见区域内 的surface部分内容才可见,可见区域外的部分不可见。surface的排版显示受到视图层级关系的影响,它的兄弟视图结点会在顶端显示。这意味者 surface的内容会被它的兄弟视图遮挡,这一特性可以用来放置遮盖物(overlays)(例如,文本和按钮等控件)。注意,如果surface上面 有透明控件,那么它的每次变化都会引起框架重新计算它和顶层控件的透明效果,这会影响性能。 定义 SurfaceView是View类的子类,可以直接从内存或者DMA等硬件接口取得图像数据,是个非常重要的绘图视图。它的特性是:可以在主线程之外的线程中向屏幕绘图上。这样可以避免画图任务繁重的时候造成主线程阻塞,从而提高了程序的反应速度。在游戏开发中多用到SurfaceView,游戏中的背景、人物、动画等等尽量在画布canvas中画出。 绘制机制 更详细的讲解:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2012/1201/656.html 实现 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 public class MainActivity extends Activity { private SurfaceView surfaceView @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); surfaceView=new SurfaceView(this); setContentView(surfaceView); surfaceView.getHolder().addCallback(callback); } /** * surface的回调 */ private SurfaceHolder.Callback callback = new SurfaceHolder.Callback() { @Override public void surfaceDestroyed(SurfaceHolder holder) { //在surface销毁的时候调用 } @Override public void surfaceCreated(SurfaceHolder holder) { //在创建时激发,一般在这里调用画图的线程。 } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { //销毁时激发,一般在这里将画图的线程停止、释放。 } }; } }
设置Keymap setting=>左侧输入框输入keymap。如图 [Eclipse Mac osx]版常用快捷键 1 2 3 4 5 6 7 8 9 10 cmd+[ //返回到上一个查看代码的位置(蓝色按钮Back) cmd+] //返回到下一个之前查看代码的位置(蓝色按钮Forword) cmd+d //删除一行 cmd+o //查看当前类所有方法 cmd+alt+下方向键 //复制一行代码 ctrl+鼠标左键 //跳如该方法或者该文件内 cmd+enter //快速修复 cmd+shift+f //格式化代码 cmd+shirt+r //全局文件快速查找 ctrl+h //全局查找 异常问题修复 切换到eclipse_mac_osx的keymap的发现搜索关键词的快捷键无效 先在keymap栏的右侧输入find关键词,你会发现find功能没有指定快捷键 接下来你需要双击该列,就会弹出一个菜单. 点击菜单后选择Add keybord shortcut。 然后给他设置一个快捷键就可以了 我这里设置的cmd+f。可以根据自己需要去设置。 [Mac osx]版常用快捷键 1 2 3 4 5 6 7 8 9 10 cmd+[ //返回到上一个查看代码的位置(蓝色按钮Back) cmd+] //返回到下一个之前查看代码的位置(蓝色按钮Forword) cmd+d //复制上一行 cmd+o //查看当前类所有方法 cmd+alt+下方向键 //复制一行代码 cmd+鼠标左键 //跳如该方法或者该文件内 alt+enter //快速修复 cmd+shift+l //格式化代码 cmd+shirt+r //全局文件快速查找 Shift+F6 //重命名 Search 1 2 cmd+R //Replace Cmd+F //find 自定义快捷键 如以上的快捷键都不满意,可以自行修改快捷键。详细流程可以参考上面的异常问题修复 1 2 关键字 功能 back 回退到上一个文件查看的位置
Android studio中默认的日志打印都是白色。这对我们日常开发查找Log信息非常影响效率。此时我们就需要对Log信息根据级别进行相应高亮。其实配置log级别对应的颜色相对简单,但是很多开发者并不知道由此功能。 效果图 如何配置logcat高亮 在工具栏中找到setting=>android logcat.即可对Android logcat日志各种打印级别设置颜色。 在选择时 要将红色的框内的钩取消才可编辑。
有时候在切换多个Android studio的项目时候,原本项目是由svn或者git管理或者你的项目是由其他的版本控制工具clone下来的,你会发现在项目包中点击右键弹出的菜单,你会发现并没有git或者svn的选项。那么如何解决呢,看下文。 菜单里点击cvs 然后选中Enable Vesion…….. 紧接着选中相应版本控制就可以了 最后在项目包中鼠标右键就可以看到git选项了。
最后更新时间2016-07-04 推荐链接 Android studio中文社区 Android studio官方下载的版本列表 倍数提高工作效率的 Android Studio 奇技 历史 Android studio1.3新特性 Android studio1.4新特性 Android studio2.0新特性 基本操作 Android studio的基础使用教程一 Android Studio更新升级方法 工具配置 Android studio logcat高亮 Android studio mac 快捷键 项目构建 Android Studio导入Eclipse项目 Android Studio导入AS项目(出现的问题) Android Studio使用jni、so库 Android Studio开发JNI工程 Android Studio Build缓慢问题 Android Studio导入项目在buid环节卡主问题 Gradle Gradle基础 Android发布项目到JCenter 插件 Android Studio插件整理(荐) Android Studio插件汇总(知乎) 打包 多渠道打包 Git和GitHub Android studio上使用github 异常解决 Android Studio Failed to complete Gradle execution Android studio报AAPT err(854725124): AndroidStudio_local path doesn’t exist解决办法 Could not download artifact ‘ecj.jar (org.eclipse.jdt.core.compiler:ecj:4.4.2) Android Studio 错误: 非法字符: ‘\ufeff’ 解决方案|错误: 需要class, interface或enum AndroidStudio_local path doesn’t exist解决办法
在经过上一篇的博客搭建后,很多是否对默认的主题并不是很满意,是否希望可以打造一款属于自己风格的博客主题呢? 更换主题 有哪些主题可以更换 hexo官方主题 github上的hexo的主题大全 知乎上的hexo的主题排行版 如何进行更换主题 Jacman主题使用教程 主题和博客的相关配置 添加导航项目 以我的路径为例:G:\Hexo\themes\jacman\_config.xml主题默认的两个导 航是主页和归档: /archives后是导航的访问路径。前面是导航的名称 根据这个规律自行添加导航和访问路径即可 1 2 3 4 5 6 ##### Menu 导航项 menu: 主页: / 归档: /archives 摄影: /cameras About: /abouts 为导航项设置加载页面 archives导航是默认开启的,archives导航下的文章默认的目录是source\_posts\在此文件夹下新建xx.md文件。归档下就会显示相应的文章item cameras和abouts导航对应的文件夹是sourc/cameras和source/abouts。并在此目录下新建index.md.之后点击对应的menus时就默认加载目录下index.md文件 生成rss 生成插件 1 npm install hexo-generator-feed --save 配置hexo/_config.xml(详情可以查看第一篇时提供的_config.xml) 1 plugins: #插件,例如生成 RSS 和站点地图的 - hero-generator-feed - hexo-generator-sitemap 这里要注意的是该配置必须在themes设置的前面配置,否则不起作用。配置完后clean一下重新生成一下就好。 最后需要在导航上添加你的RSS链接。具体查看相关的主题配置。 以下是RSS的链接(比如我的),部署到服务器,输入此链接看是否生效 1 waylenw.github.io/atom.xml
本博主要是mac使用操作教程汇总。不定时的更新。 推荐: Mac开发配置配置手册 系统基本介绍 系统目录结构介绍 基本操作 Mac卸载软件的四种方法 Mac修改hosts文件 如何使用右键 1.两指点击触摸板 2.⌃+单击触摸板 手势操作 系统偏好设置=》触摸板=》里面可以查看所有相关的手势操作,有图演示非常易懂 20个Mac用户必须掌握的触摸手势 软件 OS x yosemite jdk安装路径和环境变量配置
不定时更新 本文主要是收集移动开发的大神系列的博客(目前主要是Android方向),以及一些高质量的文章的网站。 推荐 android-dev-cn(Android开发大神博客汇总) 组织 Square 美国一家支付公司。 开源项目有: okhttp Android网络请求框架。支持HTTP2.0。有对推送等一些功能的封装。 facebook 脸书,全球最火的社交软件。 开源项目有: react-native 淘宝 这个就不介绍了 开源项目: Android 国外 hannesdorfmann blog:http://hannesdorfmann.com github:https://github.com/sockeqwe?tab=repositories 国内 胡凯 Android training的中文发起者。性能优化典范中文译文。目就职于腾讯 CSDN_blog:http://blog.csdn.net/kesenhoo/article/details/7362512 个人网站:http://hukai.me/ 鸿洋 很多自定义View的教程,博客通俗易懂 blog:http://blog.csdn.net/lmj623565791?viewmode=contents github:https://github.com/sockeqwe?tab=repositories/“ trinea 性能优化,Android开源项目汇总 blog:http://www.trinea.cn/category/android Iteye的blog:http://trinea.iteye.com/ github:https://github.com/Trinea 徐宜生 《Android群英传》的作者。慕课网的讲师。较为突出对多图形图像。 blog:http://blog.csdn.net/eclipsexys?viewmode=contents 简书:http://www.jianshu.com/users/dfc0ed52c22b/latest_articles 张明云 知乎Android频道的热门回答常客。具有丰富Andorid开发经验. blog:http://zmywly8866.github.io/ 张兴业 csdn博客专家。对ios和android都相关的博客专栏 blog:http://blog.csdn.net/xyz_lmn?viewmode=contents 任玉刚 csdn博客专家.《Android开发艺术探索的作者》.在百度安全卫士的团队 blog:http://blog.csdn.net/singwhatiwanna 农民伯伯 Android中文Api的发起人。 blog:http://www.cnblogs.com/over140/ 郭霖 《Android第一行代码》的作者。有很多实战性博客。知识点很深入 blog:http://blog.csdn.net/guolin_blog 夏安明 知识点比较深入,比较多的源码分析的讲解。涉及功能应用也比较多。 blog:http://blog.csdn.net/xiaanming?viewmode=contents stormzhang 9GAG、CustomLoading等的开源项目的作者。薄荷科技的项目主管。 blog:http://stormzhang.com/ 工匠若水 csdn博客专家。设计模式的深入理解。很多源码级的解析。 blog:http://blog.csdn.net/yanbober 巫_1曲待续 很多基础性性文章,而且比较全面。推荐新手收藏的。 blog:http://blog.csdn.net/wwj_748?viewmode=contents 阳春面 寻找的干货收集好地方,官方教程的中文版的收集 blog:http://www.aswifter.com xiaochao1234 很多基础的文章,包含一些开发初学者的建议 blog:http://www.cnblogs.com/xiaochao1234/archive/2015/06.html lightSky blog:https://github.com/lightSky 优秀博文网站 泡在网上的日子 新技术看这里基本ok,转载博客的质量很高 网址链接:http://www.jcodecraeer.com/plus/list.php?tid=18 Android 开发周报 收集Android开发最新的一些文章和开源项目 网址链接:http://www.race604.com/tag/Android-Weekly/ 开发技术前线 高质量文章转载 网址链接:http://www.devtf.cn/ 技术小黑屋 技术分享(书籍和文章不等主要的方向是java和andrid) 网址链接:http://droidyue.com/ 程序员头条 为程序员提供iOS、C++、Java、Android、Web、C、.net在线学习平台 网址链接:http://www.90159.com/
您可以订阅此RSS以获取更多信息