熊猫儿 发表于 2016-9-17 09:44

这与ListView中的ViewHoloder实现方式相似,所以如果把DataBinding运用到ListView的ViewHolder中,就不需要多生成一个ViewHolder,直接使用这个ViewDataBinding类即可,例如ListAdapter实现:public static class ListAdapter extends BaseAdapter{    ...    @Override    public View getView(int position, View convertView, ViewGroup parent) {      ItemFooBinding binding;      if (convertView == null){            LayoutInflater inflater = LayoutInflater.from(parent.getContext());            binding = DataBindingUtil.inflate(inflater,R.layout.item_foo,parent,false);      } else {            binding = DataBindingUtil.getBinding(convertView);      }      if (binding == null) return null;      bind(binding,position);      return binding.getRoot();    }    private void bind(ItemFooBinding binding, int position) {      binding.title.setText("position:" + position);      Context context = binding.avatar.getContext();      int colorId = position % 2 == 0? R.color.colorAccent : R.color.colorPrimary;      binding.avatar.setBackgroundColor(ContextCompat.getColor(context,colorId));    }}
[*]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
8 总结
[*]DataBinding 库非常小
目前Android Data Binding在运行类库只有632个方法数,算上每个layout.xml自动生成的ViewDataBinding子类(demo中每个类不超过20个方法数),方法数总和也非常有限。
http://img.blog.csdn.net/20160504094302479

熊猫儿 发表于 2016-9-17 09:45


[*]DataBinding 运行时没有多余性能损耗
DataBinding所有的View注入、View赋值、Binding都是编译器自动生成的代码,这些重复的体力劳动本身就需要去做,只是交给了编译器来完成,所以运行时没有多余的性能损耗。
[*]DataBinding 可以减少错误率
既然View注入、View赋值、Binding都是编译器自动完成的,只要使用正确,100%无低级错误保证,可以提高代码质量,让开发者心情愉悦。
[*]DataBinding 对编译时长的影响
还没实际运用到生产环境,肯定有所延长,具体量级还未知。
9 Reference官方Data-Binding-Guide
杨辉的个人博客-(译)Data Binding 指南
LyndonChin/MasteringAndroidDataBinding
googlesource/data-binding

Android游戏开发之体育类游戏作者:ch_984326013Android游戏开发之体育类游戏 体育类游戏是面向体育爱好者的一类游戏,虽然拥有的玩家群体如何角色扮演或益智类游戏多,但是体育类游戏还是在众多的手机游戏种类中因独特的内容题材占有了一席之地。以下我们以疯狂足球为例,向大家展示体育类游戏的开发过程及需要注意的事项:本游戏主要由欢迎界面、游戏菜单界面、加载界面和游戏界面组成。下面分别就这几个界面加以说明。1、 欢迎界面游戏运行后,在欢迎界面中,首先播放的是一段欢迎动画,然后显示游戏的菜单。动画截图如下:http://hi.csdn.net/attachment/201106/29/8732530_1309305646Kpk6.jpg   http://hi.csdn.net/attachment/201106/29/8732530_130930560346el.jpg    http://hi.csdn.net/attachment/201106/29/8732530_13093056460XA2.jpg          这段动画主要是三张图片的轮流显示!代码并不怎么难,在这里暂不讨论。动画播放完之后,就进入游戏的菜单界面了;游戏菜单界面如下:http://hi.csdn.net/attachment/201106/29/8732530_13093056473GU4.jpg
http://lib.csdn.net/article/android/10580

熊猫儿 发表于 2016-9-18 08:49

菜单最上方是一个俱乐部标志选择器(该选择器主要是用一个自定义的Gallery实现);中间为游戏中前、中、后场的球员站位分布调节面板以及声音开关;菜单下方是退出和开始按钮。2、 加载界面当玩家在菜单中完成游戏的各项选择设置之后,单击下方的“开始”按钮,屏幕就切换到游戏的加载界面,该界面截图如下:http://hi.csdn.net/attachment/201106/29/8732530_1309305647mbMK.jpg
在该界面中用一个图片的进度条来显示当前进度(该进度条的原理是这样的:先把屏幕设置黑色,其次弄一张图片,使图片的颜色从左到右逐渐变深!然后弄一个Rect框,该Rect的颜色也是黑色,让它遮盖该图片!最好在修改数据线程中不停的改变Rect的初始x坐标值,让该图片慢慢的显示出来!这样就做出了进度条的效果);3、 游戏界面当加载进度条走完之后,单击屏幕上任意位置就会切换到游戏界面,该界面截图如下:http://hi.csdn.net/attachment/201106/29/8732530_13093056482cwH.jpg

熊猫儿 发表于 2016-9-18 08:51

在游戏界面中,球场上面是电脑的球门,下面是玩家的球门。玩家可以移动左右方向键来控制自己的球队与电脑展开追逐,当足球射入球门之后,屏幕会提示一个“进球啦”对话框,如下左图。在游戏进行中,玩家可以单击屏幕最上方中间的计分板来弹出游戏菜单,如下右图。       http://hi.csdn.net/attachment/201106/29/8732530_1309305648gqU6.jpg         http://hi.csdn.net/attachment/201106/29/8732530_1309305649H0UX.jpg           本游戏的规则是在比赛中,对阵双方进球数首先达到指定个数者获胜。如果获胜的是玩家,如下左图,那么游戏将会对一些参数进行调整(如足球移动速度等),让玩家继续挑战高级的赛事。如果获胜者是电脑,则如下右图所示。http://hi.csdn.net/attachment/201106/29/8732530_1309305654Ahrs.jpg。      http://hi.csdn.net/attachment/201106/29/8732530_13093056543ySS.jpg
本游戏目前的框架基本就这样,如果要增加可玩性,还可以适当的添加些奖励物品!在此就不多赘述!下面我们来讲些游戏中一些关键代码及一些代码需要注意的问题!

熊猫儿 发表于 2016-9-18 08:56

一个好的项目,大凡高手在开始动手设计之前,都会选择一种设计模式!在这里我们选择MVC模式!有人可能会问MVC模式不是WEB系统职能分工模式吗?这个是当然,但是在这里我们也可以借用这种解决问题的思路!在这里我们把继承Activity的主类作为整个项目的控制模块!其次把继承自SurfaeView的类作为视图类,还有就是继承自Thread的线程类。其实在这里每个界面模块我们都可以把它分成三个部分:继承SurfaceView的视图类、时刻修改后台数据的线程类和时刻刷新界面的线程类!下面我们来讲解下每个模块的一些关键代码及需注意事项.1、 欢迎界面WelcomeView.java在该类onDraw(Canvas canvas)方法中,需要注意的是:canvas.drawBitmap(bmpSound, 135, 370, paint);//绘制声音开关(这个算法好,如果wantSound为true则,取0,为false则取1)WelcomeThread.java在该类中,主要是在后台时刻更新数据,定义animationCounter、rotateCounter等,主要作用是为延长时间!让效果看起来更好些;WelcomeDrawThread.java该类的作用是按一定时间间隔重新绘制界面!2、 加载界面LoadingView.java在该类onDraw方法中中,最重要的是显示当前进度的绘制!就是用以张图片,然后绘制一个黑Rect框遮住这张图片,然后再后台修改黑框的x坐标,让这张图片慢慢的显示出来,这样就做出了进度条的效果!LoadingThread.java(1)       该类的主要作用是,在该线程中按一定时间间隔改变Rect框的x坐标值!(2)       还有就是在该线程中必须加一个判断,判断进度值是否已满,即是否等于100;如果等于100,则就要把flag设置为false;否则程序会一直循环执行下去;LoadingDrawThread.java在后台按一定间隔时间重新绘制界面!3、 游戏界面 GameView.java该类是游戏中比较重要的一个类,所有游戏中可绘制的内容都在该对象中留有引用!具体说明可参考源码注解!在此不多赘述!4、FootballActivity.java(1)本游戏中的Activity起到了控制器的作用。除了负责在不同的界面之间切换视图外,它还负责处理玩家的键盘单击事件和修改键盘状态等工作。(2)在该类中定义多个Rect,是为处理单击事件而建立的!当药单击一些不规则图片时,可以定义一个Rect把该图片框起来。当只要点击该Rect区域内,就能响应该事件!5、CustomGallery.java   在该类中,主要是自定义一个俱乐部标志选择器(Gallery类似),在该类的drawGallery(Canvas canvas,Paint paint)方法中。需要注意的是,canvas中绘制内容,如果两张图片绘制在一个坐标点,则后面绘制的图片会把前面的图片给覆盖掉。所以在绘制过程中应由里向外!比如在此方法中就要依次绘制背景颜色,然后图片本身,最后是图片最外层的边框,顺序不能改变否则会达不到预期的效果!

熊猫儿 发表于 2016-9-18 08:57

【Android笔记 四 】使用android 调用震动的例子作者:octobershiner   这两天干了点别的,原因是昨天使用getProviders()方法时,用到了ArrayList这个类,突然想深入的了解他的机制,结果收获非常多,很纠结的看了一位大神分析的JAVA COLLECTION FRAMEWORK的源代码,这样Fail Fast机制就赤裸裸的出现在眼前了,中间核心代码带我走进了设计模式的大门,原来源代码使用了装饰器设计模式,今天自己也是总结了一下学习成果 在 http://blog.csdn.net/octobershiner/article/details/6631997
言归正传,调用Android系统的震动,只需要一个类 那就是Vibrator ,这个类在hard包中,一看系统级的服务,又要通过manifest.xml文件设置权限了

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"      package="uni.vibrator"      android:versionCode="1"      android:versionName="1.0">    <uses-sdk android:minSdkVersion="8" />    <application android:icon="@drawable/icon" android:label="@string/app_name">      <activity android:name=".VibratorDemoActivity"                  android:label="@string/app_name">            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>      </activity>    </application>   <uses-permission android:name="android.permission.VIBRATE" /></manifest>
下面还是一起学习一下SDK吧

Class that operates the vibrator on the device.
If your process exits, any vibration you started with will stop.

//Vibrator类用来操作设备上的震动,如果你的线程退出了,那么启动的震动也会停止

---------------------------------------------------------------------------------------------------------------------------------------------------
public void vibrate (long[] pattern, int repeat)
Since: API Level 1

熊猫儿 发表于 2016-9-18 08:58

Vibrate with a given pattern.//根据给定的节奏震动

Pass in an array of ints that are the durations for which to turn on or off the vibrator in milliseconds. The first value indicates the number of milliseconds to wait before turning the vibrator on. The next value indicates the number of milliseconds for which to keep the vibrator on before turning it off. Subsequent values alternate between durations in milliseconds to turn the vibrator off or to turn the vibrator on.
//传递一个整型数组作为关闭和开启震动的持续时间,以毫秒为单位。第一个值表示等待震动开启的毫秒数,下一个值表示保持震动的毫秒数,这个序列值交替表示震动关闭和开启的毫秒数

To cause the pattern to repeat, pass the index into the pattern array at which to start the repeat, or -1 to disable repeating.
//为了重复的按设定的节奏震动,传递index参数表示重复次数,用-1表示不重复。

Parameters
pattern   an array of longs of times for which to turn the vibrator on or off.
repeat   the index into pattern at which to repeat, or -1 if you don't want to repeat.
---------------------------------------------------------------------------------------------------------------------------------------------------

还包含一个方法叫做cancel,用来取消震动

一段演示的代码

/* * @author octobershiner * 2011 7 25 * SE.HIT * 一个使用android手机震动的demo * */package uni.vibrator;import android.app.Activity;import android.content.Context;import android.os.Bundle;import android.os.Vibrator;public class VibratorDemoActivity extends Activity {        private Vibrator vibrator;    /** Called when the activity is first created. */    @Override    public void onCreate(Bundle savedInstanceState) {      super.onCreate(savedInstanceState);      setContentView(R.layout.main);                /*         * 想设置震动大小可以通过改变pattern来设定,如果开启时间太短,震动效果可能感觉不到         * */      vibrator = (Vibrator)getSystemService(Context.VIBRATOR_SERVICE);      long [] pattern = {100,400,100,400};   // 停止 开启 停止 开启         vibrator.vibrate(pattern,2);         //重复两次上面的pattern 如果只想震动一次,index设为-1   }      public void onStop(){            super.onStop();            vibrator.cancel();    }}


具体效果,不知道如何在虚拟机上模拟,所以只好先采用真机测试了,如果有知道用模拟器模拟的方法,希望告诉我一下~
http://lib.csdn.net/article/android/35927

熊猫儿 发表于 2016-9-18 08:59

Android Https相关完全解析 当OkHttp遇到Https作者:dzc372787439一、概述其实这篇文章理论上不限于okhttp去访问自签名的网站,不过接上篇博文了,就叫这个了。首先要了解的事,okhttp默认情况下是支持https协议的网站的,比如https://www.baidu.com,https://github.com/hongyangAndroid/okhttp-utils等,你可以直接通过okhttp请求试试。不过要注意的是,支持的https的网站基本都是CA机构颁发的证书,默认情况下是可以信任的。当然我们今天要说的是自签名的网站,什么叫自签名呢?就是自己通过keytool去生成一个证书,然后使用,并不是CA机构去颁发的。使用自签名证书的网站,大家在使用浏览器访问的时候,一般都是报风险警告,好在有个大名鼎鼎的网站就是这么干的,https://kyfw.1230**/otn/,点击进入12306的购票页面就能看到了。如下界面:http://img.blog.csdn.net/20150831092455971大家可以尝试拿okhttp访问下:OkHttpClientManager.getAsyn    ("https://kyfw.1230**/otn/", callack);
[*]1
[*]2
会爆出如下错误javax.net.ssl.SSLHandshakeException:   java.security.cert.CertPathValidatorException:         Trust anchor for certification path not found.
[*]1
[*]2
[*]3
好了,本篇博文当然不是去说如何去访问12306,而是以12306为例子来说明如何去访问自签名证书的网站。因为部分开发者app与自己服务端交互的时候可能也会遇到自签名证书的。甚至在开发安全级别很高的app时,需要用到双向证书的验证。那么本篇博文的基本内容包含:
[*]https一些相关的知识
[*]okhttp访问自签名https网站
[*]如何构建一个支持https的服务器(这里主要为了测试多个证书的时候,如何去加载)
[*]如何进行双向证书验证

http://lib.csdn.net/article/android/35927


熊猫儿 发表于 2016-9-19 15:16

二、Https相关知识关于特别理论的东西大家可以百度下自己去了解下,这里就简单说一下,HTTPS相当于HTTP的安全版本了,为什么安全呢?因为它在HTTP的之下加入了SSL (Secure Socket Layer),安全的基础就靠这个SSL了。SSL位于TCP/IP和HTTP协议之间,那么它到底能干嘛呢?它能够:
[*]认证用户和服务器,确保数据发送到正确的客户机和服务器;(验证证书)
[*]加密数据以防止数据中途被窃取;(加密)
[*]维护数据的完整性,确保数据在传输过程中不被改变。(摘要算法)
以上3条来自百度下面我们简单描述下HTTPS的工作原理,大家就能对应的看到上面3条作用的身影了:HTTPS在传输数据之前需要客户端(浏览器)与服务端(网站)之间进行一次握手,在握手过程中将确立双方加密传输数据的密码信息。握手过程的简单描述如下:
[*]浏览器将自己支持的一套加密算法、HASH算法发送给网站。
[*]网站从中选出一组加密算法与HASH算法,并将自己的身份信息以证书的形式发回给浏览器。证书里面包含了网站地址,加密公钥,以及证书的颁发机构等信息。
[*]浏览器获得网站证书之后,开始验证证书的合法性,如果证书信任,则生成一串随机数字作为通讯过程中对称加密的秘钥。然后取出证书中的公钥,将这串数字以及HASH的结果进行加密,然后发给网站。
[*]网站接收浏览器发来的数据之后,通过私钥进行解密,然后HASH校验,如果一致,则使用浏览器发来的数字串使加密一段握手消息发给浏览器。
[*]浏览器解密,并HASH校验,没有问题,则握手结束。接下来的传输过程将由之前浏览器生成的随机密码并利用对称加密算法进行加密。
握手过程中如果有任何错误,都会使加密连接断开,从而阻止了隐私信息的传输。ok,以上的流程不一定完全正确,基本就是这样,当然如果有明显错误欢迎指出。根据上面的流程,我们可以看到服务器端会有一个证书,在交互过程中客户端需要去验证证书的合法性,对于权威机构颁发的证书当然我们会直接认为合法。对于自己造的证书,那么我们就需要去校验合法性了,也就是说我们只需要让OkhttpClient去信任这个证书就可以畅通的进行通信了。当然,对于自签名的网站的访问,网上的部分的做法是直接设置信任所有的证书,对于这种做法肯定是有风险的,所以这里我们不去介绍了,有需要自己去查。下面我们去考虑,如何让OkHttpClient去信任我们的证书,接下里的例子就是靠12306这个福利站点了。首先导出12306的证书,这里12306提供了下载地址:12306证书点击下载下载完成,解压拿到里面的srca.cer,一会需要使用。ps:即使没有提供下载,也可以通过浏览器导出的,自行百度。

熊猫儿 发表于 2016-9-19 15:16

三、代码(一)、访问自签名的网站首先把我们下载的srca.cer放到assets文件夹下,其实你可以随便放哪,反正能读取到就行。然后在我们的OkHttpClientManager里面添加如下的方法:public void setCertificates(InputStream... certificates){    try    {      CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");      KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());      keyStore.load(null);      int index = 0;      for (InputStream certificate : certificates)      {            String certificateAlias = Integer.toString(index++);            keyStore.setCertificateEntry(certificateAlias, certificateFactory.generateCertificate(certificate));            try            {                if (certificate != null)                  certificate.close();            } catch (IOException e)            {            }      }      SSLContext sslContext = SSLContext.getInstance("TLS");      TrustManagerFactory trustManagerFactory =             TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());         trustManagerFactory.init(keyStore);      sslContext.init            (                   null,               trustManagerFactory.getTrustManagers(),               new SecureRandom()            );       mOkHttpClient.setSslSocketFactory(sslContext.getSocketFactory());    } catch (Exception e)    {      e.printStackTrace();    } }
[*]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
为了代码可读性,我把异常捕获的部分简化了,可以看到我们提供了一个方法传入InputStream流,InputStream就对应于我们证书的输入流。
页: 22 23 24 25 26 27 28 29 30 31 [32] 33 34 35 36 37 38 39 40 41
查看完整版本: 【Android的一些重要知识6。。。。】