一个自定义下拉刷新ListView的实现 原理很简单:通过对ListView添加了一个刷新layout,滚动中时不断改变header的高度和内容并记录一些状态,在用户手指离开屏幕时根据状态决定进行刷新还是放弃刷新。 主要是通过重写ListView的onTouchEvent和OnScrollListener的onScrollStateChanged、onScroll函数实现 先介绍下刷新状态共有四种,如下: CLICKTOREFRESH 点击刷新状态,为初始状态 DROPDOWNTO_REFRESH 当刷新layout高度低于一定范围时,为此状态 RELEASETOREFRESH 当刷新layout高度高于一定范围时,为此状态 REFRESHING 刷新中时,为此状态 2.1 onTouchEvent函数 public boolean onTouchEvent(MotionEvent event)根据用户在屏幕上的move事件,进行相应操作,如下: ACTION_DOWN表示用户手指刚接触屏幕,会记录用户此时touch的点的y坐标,在下面调整高度时使用 ACTION_MOVE表示用户手指正在屏幕上移动,此时会不断调整header的高度,即下拉时刷新item部分高度的不断变化 ACTION_UP表示用户手指离开屏幕,此时会根据当前状态决定是进行刷新还是放弃刷新,若刷新调用用户设置的OnRefreshListener接口。 2.2 onScrollStateChanged函数 public void onScrollStateChanged(AbsListView view, int scrollState) 记录listView当前的滚动状态到currentScrollState,包括三种状态: SCROLLSTATETOUCH_SCROLL ListView正在滚动中,并且手指尚未离开屏幕 SCROLLSTATEFLING ListView仍在滚动中,但用户手指已经离开屏幕 SCROLLSTATEIDLE ListView已经停止滚动 2.3 onScroll函数 public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) 根据listView当前的滚动状态即currentScrollState和当前刷新的状态不断修改header内容显示和刷新状态,如下: ListView为SCROLLSTATETOUCH_SCROLL状态(按着不放滚动中)并且刷新状态不为REFRESHING...

Gradle学习笔记 转向AS的时候遇到的最大困难其实是gradle的使用,为了学习AS有必要先对gradle有一个比较深入的理解,不然就变成了只知其然,不知其所以然,显然这不是一个负责任的态度。 gradle是什么 不能免俗,也要先写两句,这里只写我自己的理解。 gradle是什么?从2011年开始很火的一个开源的构建框架,用groovy写的,备受业界推崇,连Google也把它作为Android官方IDE中的构建工具,取代了之前ADT中的Ant。 提起构建,从shell脚本,make,ant,maven到现在的gradle,一切似乎是个循环,从最开始的随便写(也可以认为是可编程),到后来的系统化,xml规范化,中央仓库解决依赖重复,这时人们又似乎被束缚了手脚,又开始羡慕洪荒时代那种像写代码一样做配置的快感,于是gradle出现了。 gradle能做什么 理论上它可以做任何groovy语言可以做的事情。但更多的时候,人们用它来完成构建。 单纯的gradle java && gradle android && gradle 打包签名 gradle 默认输出 release apk 是没有签名的,那么我们需要签名的很简单,只需要在android{}里面补充加上加上即可。 signingConfigs { myConfig{ storeFile file("gradle.keystore") storePassword "gradle" keyAlias "gradle" keyPassword "gradle" } } buildTypes{ release { signingConfig signingConfigs.myConfig } } 然后,运行gradle clean gradle build ,这次在build/apk 你看到了多了一个[项目名]-release-unaligned, 从字面上面我就可以知道,这个只是没有进行zipAlign 优化的版本而已。而[项目名]-release 就是我们签名,并且zipAlign...

从jekllForBootstrap转到原生jekyll,缺少了rake命令支持,每次新建文章都显得比较繁琐。于是自己用python写了个脚本,实现类似的功能,自己用着还行,代码如下: #!/usr/bin/env python #-*- coding: utf-8 -*- import time import os import sys def buildThemeDic(): themeDic = {}; themeDic["W"] = "/assets/article_images/desktop.JPG"; themeDic["N"] = "/assets/article_images/nightmare.JPG"; themeDic["D"] = "/assets/article_images/dawn.JPG"; return themeDic; def checkEnv(): basePath = os.path.abspath('.'); checkPath = basePath + "/_posts" return os.path.exists(checkPath); def checkAndWrite(time,title,content): fileName = time+'-'+title+'.md'; basePath = os.path.abspath('.'); checkFile...

多线程 1. java中有几种方法可以实现一个线程? 继承Thread类,实现Runnable接口 创建一个线程的唯一方法是实例化java.lang.Thread类(或其子类),并调用其start()方法 2. 如何停止一个正在运行的线程? 调用ThreadInstanceA.inerrupt()方法,这样当A线程在Thread的sleep,join方法,或者Object的wait方法的时候会直接抛出InerruptedException,捕捉后便可退出。 public void shutdown() { stop = true; this.interrupt(); try { this.join(); } catch(InterruptedException ie) {} } 停止一个线程的最佳方法是让它执行完毕,没有办法立即停止一个线程,但你可以控制何时或什么条件下让他执行完毕 通过条件变量控制线程的执行,线程内部检查变量状态,外部改变变量值可控制停止执行。为保证线程间的即时通信,需要使用volatile关键字或锁,确保读线程与写线程间变量状态一致。 下面给一个模板: public class BestPractice extends Thread { private volatile boolean finished = false; // ① volatile条件变量 public void stopMe() { finished = true; //...

Android手势操作 一盏灯, 一片昏黄; 一简书, 一杯淡茶。 守着那一份淡定, 品读属于自己的寂寞。 保持淡定, 才能欣赏到最美丽的风景! 保持淡定, 人生从此不再寂寞。 前言 利用手势操作在现在的APP中越来越普及,大多数时候使用Fling,Scroll等Gesture能大幅度提高用户的操作体验,特别是大屏手机返回键程越来越大的现状下。 在Android系统下,手势识别是通过GestureDetector.OnGestureListener接口实现的,不过官方的文档可能觉得这部分太基础和简单了,所以官方的API文档中对手势的讲解描述的都很简单,API Demo中也没有提供一个清楚的例子,所以自己总结一下,其中还是涉及不少的基础知识和一些官方文档中说明不清的地方,如果不能好好掌握这些基础知识,做起事情来难免要吃一些苦头。言归正传,下面我们开始: 基础知识 我们先来明确一些概念,首先,Android的事件处理机制是基于Listener(监听器)来实现的,比我们今天所说的触摸屏相关的事件,就是通 过onTouchListener。其次,所有View的子类都可以通过setOnTouchListener()、 setOnKeyListener()等方法来添加对某一类事件的监听器。第三,Listener一般会以Interface(接口)的方式来提供,其中 包含一个或多个abstract(抽象)方法,我们需要实现这些方法来完成onTouch()、onKey()等等的操作。这样,当我们给某个view设置了事件Listener,并实现了其中的抽象方法以后,程序便可以在特定的事件被dispatch到该view的时候,通过callbakc函数给予适当的响应。 这篇文章简单介绍了事件触发的过程:Android事件分发图解 实作 我们现在实作一个使用手势的例子。 我们给RelativeView的实例my_view设定了一个onTouchListener,因为GestureTest类实现了OnTouchListener 接口,所以简单的给一个this作为参数即可。onTouch方法则是实现了OnTouchListener中的抽象方法,我们只要在这里添加逻辑代码即 可在用户触摸屏幕时做出响应, public class MainActivity extends ActionBarActivity implements View.OnTouchListener,GestureDetector.OnGestureListener{ GestureDetector gestureDetector = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); gestureDetector = new GestureDetector(this); gestureDetector.setIsLongpressEnabled(true);...