当前位置:  编程技术>移动开发
本页文章导读:
    ▪Core Animation之框架简介(1)        Core Animation之框架简介(一) Core Animation之框架简介(一) 作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/11180241 转载请注明出处 最近花了不少时间学习了核心动画(Core Anima.........
    ▪ 2530 开发板上的某个按键批改        2530 开发板上的某个按键修改         对于手上拥有一个2530开发板的Zstack初学者来说,最经常做的事情也许就是按下开发板上的某个按键,进行绑定或者远程控制另一个开发板上的LE.........
    ▪ 调用ITelephony的endCall( )步骤自动挂断电话       调用ITelephony的endCall( )方法自动挂断电话这只是时长三个月左右的Android培训, 所以学到的都是应用层面的东东(自己以为), 不可能对整个Android进行系统深入的讲解.  ------------------------ 各种来.........

[1]Core Animation之框架简介(1)
    来源: 互联网  发布时间: 2014-02-18
Core Animation之框架简介(一)
Core Animation之框架简介(一)
作者:wangzz
原文地址:http://blog.csdn.net/wzzvictory/article/details/11180241
转载请注明出处

最近花了不少时间学习了核心动画(Core Animation),打算用几篇日志来整理看过的内容,大家共同学习。Core Animation在IOS和MAC OSX上略有区别,这里只介绍IOS部分。
一、Core Animation简介
1、简介
Core Animation是一套包含图形绘制、投影、动画的Objective-C类集合,该框架包含在QuartzCore.framework中,它因为被用于处理更为强大的平滑的转场效果而引入OS X Leopard和iOS而出名。Core Animation和其它框架的位置关系如下图所示:

CPU作为电脑的处理核心,负责处理各种各样的数据,什么都可以干。而GPU作为一个专门为图形高并发计算量身定做的处理单元,能同时更新所有的像素,并把结果显示到显示器上,在图形处理方面具有相当的专业性,而且还具有高效的特点。它的出现使得CPU从大量的图形数据处理中解放出来。
上图中的OpenGL ES是个C语言写的非常底层的图形处理框架,是个移动设备上绘制2D和3D计算机图形的标准开源库,广泛地被用在游戏的图形绘制上,负责直接驱动GPU,效率非常高,缺点是使用起来异常复杂。
Core Animation是对OpenGL ES的Objective-C封装,具有与OpenGL ES几乎等价的高性能,却隐藏了OpenGL ES的复杂性。
我们经常说到的硬件加速其实是指OpenGL,Core Animation/UIKit基于GPU之上对计算机图形合成以及绘制的实现,直到目前为止,IOS上的硬件加速能力还是大大领先与Android,后者由于依赖CPU的绘制,绝大多数的动画实现都会让人感觉明显的卡顿。
2、特点
主要具有具有以下特点:
①简单易用
我们只需要少量的代码就能画出各种想要的图形,实现相当炫的动画效果,这要归功与Core Animation框架的完美设计。
②、轻量级
Core Animation使用的数据结构都是轻量级的,因此可以同时显示很多个图层,并向这些图层增加不同的动画效果。
③、高效
Core Animation的实质是OpenGL ES之上的一个抽象,它具有与OpenGL ES几乎等价的高性能。

二、Core Animation框架中的主要类
下面通过Core Animation的类结构来描述整个框架。
1、CALayer
中文名叫图层类,是整个Core Animation的基础,也是所有Core Animation图层类的父类。

2、CAAnimation
CAAnimation是所有Core Animation中动画类的父类,遵守NSCoding、NSCopying、CAMediaTiming和CAAction协议,负责实现各种动画效果,是Cocoa Touch动画的基础。

3、CADisplaylink
CADisplayLink的使用有点像NSTimer,本身也是一个定时器对象,只不过它的用途更专一,只用于界面显示帧更新相关的操作,并且通常不允许子类化。

4、CAMediaTimingFunction
该类定义了一个动画的执行步调,目前Core Animation提供有kCAMediaTimingFunctionLinear、kCAMediaTimingFunctionEaseIn、kCAMediaTimingFunctionEaseOut、kCAMediaTimingFunctionEaseInEaseOut四种,当然我们也可以定制自己想要的执行步调。

5、CATransaction
CATransaction(事务)是Core Animation中一个将若干个对图层树的属性修改操作以原子方式更新到渲染树的机制。所有对图层树的修改都需要有事务,只不过有的是隐式的使用事务,有的是显式的使用事务。事务支持嵌套使用。

6、CAValueFunction
暂时没理解该类的用途,等明白了再解释。

7、CAMediaTiming协议
官方文档中的描述:CAMediaTiming协议通过每个遵守该协议的对象描述从父对象的时间到当前对象的时间的映射,定义了一个分层的时间系统,原文如下:

The CAMediaTiming protocol models a hierarchical timing system, with each object describing the mapping of time values from the object's parent to local time.

不是很明白,这句话的含义,等理解透彻了再来解释。
总之,通过该协议,我们能为遵守该协议的CAAnimation对象提供动画的持续时间、速度和重复计数等属性。

8、NSValue
Core Animation框架对NSValue进行了类扩展,使其支持对CATransform3D结构体进行对象化转换。

到这里Core Animation框架的大致结构说完了,后续的文章会一个个解释框架中的几乎每个类。学习该框架的过程中又不少东西没理解透,请多多指教。


参考文章:
http://o0o0o0o.iteye.com/blog/1728599


    
[2] 2530 开发板上的某个按键批改
    来源: 互联网  发布时间: 2014-02-18
2530 开发板上的某个按键修改


        对于手上拥有一个2530开发板的Zstack初学者来说,最经常做的事情也许就是按下开发板上的某个按键,进行绑定或者远程控制另一个开发板上的LED的亮灭。自然而然地,大家都想知道这个过程是如何实现的,协议栈的按键处理函数在哪里,如果想自己设计开发板,假如按键接口和2530标准开发板不一样的话,又应当修改哪些参数才能保证按键能够起作用,这里我就来详细地解释一下。

按键的配置是在hal_key.c里实现的,在文件的顶端,我们能够找到如下的预编译内容:

/* SW_6 is at P0.1 */

#define HAL_KEY_SW_6_PORT   P0

#define HAL_KEY_SW_6_BIT    BV(1)

#define HAL_KEY_SW_6_SEL    P0SEL

#define HAL_KEY_SW_6_DIR    P0DIR

 

/* edge interrupt */

#define HAL_KEY_SW_6_EDGEBIT  BV(0)

#define HAL_KEY_SW_6_EDGE     HAL_KEY_FALLING_EDGE

 

/* SW_6 interrupts */

#define HAL_KEY_SW_6_IEN      IEN1  /* CPU interrupt mask register */

#define HAL_KEY_SW_6_IENBIT   BV(5) /* Mask bit for all of Port_0 */

#define HAL_KEY_SW_6_ICTL     P0IEN /* Port Interrupt Control register */

#define HAL_KEY_SW_6_ICTLBIT  BV(1) /* P0IEN - P0.1 enable/disable bit */

#define HAL_KEY_SW_6_PXIFG    P0IFG /* Interrupt flag at source */

 

对于具备大学英语水平的同学们来说,这些语句的含义并不难理解。这里是说Zstack协议栈的SW6按键被分配到了P0.1端口,下面所有的这些预编译内容都是为了保证按键被按下时,程序能够检测到并进行正确处理。我们看到这里的预编译内容涉及到了大量的寄存器,大家要适应Zstack的这一编码方式,习惯冗长的预编译命名(对于经常编写VC等高级语言代码的同学来说这也许并不算什么)。

好的,心急的同学也许已经迫不及待地想要开始修改了,我这里就列出我自己修改的将SW6分配到P0.7的配置代码:

/* SW_6 is at P0.7 */

#define HAL_KEY_SW_6_PORT   P0

#define HAL_KEY_SW_6_BIT    BV(7)

#define HAL_KEY_SW_6_SEL    P0SEL

#define HAL_KEY_SW_6_DIR    P0DIR

 

/* edge interrupt */

#define HAL_KEY_SW_6_EDGEBIT  BV(0)

#define HAL_KEY_SW_6_EDGE     HAL_KEY_FALLING_EDGE

 

/* SW_2 interrupts */

#define HAL_KEY_SW_6_IEN      IEN1  /* CPU interrupt mask register */

#define HAL_KEY_SW_6_IENBIT   BV(5) /* Mask bit for all of Port_0 */

#define HAL_KEY_SW_6_ICTL     P0IEN /* Port Interrupt Control register */

#define HAL_KEY_SW_6_ICTLBIT  BV(7) /* P0IEN - P0.6 enable/disable bit */

#define HAL_KEY_SW_6_PXIFG    P0IFG /* Interrupt flag at source */

如果对于以上配置有什么不很理解的地方我建议大家多去看看CC2530的说明文档,仔细理解每一个寄存器所起到的作用。对于嵌入式软件工程师来说,说明文档永远是最得力的帮手。

OK,在完成了以上配置之后,下面要关注的应该就是按键处理函数了,那么这个函数在哪呢?这里我们以Zstack协议栈的SampleSwitch工程为例,有一个文件我们要特别注意,这就是zcl_samplesw.c。这是应用层的源文件,对于广大Zstack协议栈开发者来说,以后对协议栈的修改很大一部分都是在这个文件中进行的。在这个文件中,找到这个函数:

static void zclSampleSw_HandleKeys( byte shift, byte keys )

{

  zAddrType_t dstAddr;

  (void)shift;  // Intentionally unreferenced parameter

 

  if ( keys & HAL_KEY_SW_1 )

  {

    // Using this as the "Light Switch"

#ifdef ZCL_ON_OFF

    zclGeneral_SendOnOff_CmdToggle( SAMPLESW_ENDPOINT, &zclSampleSw_DstAddr, false, 0 );

#endif

  }

 

  if ( keys & HAL_KEY_SW_2 )

  {

    HalLedSet ( HAL_LED_4, HAL_LED_MODE_OFF );

 

    // Initiate an End Device Bind Request, this bind request will

    // only use a cluster list that is important to binding.

    dstAddr.addrMode = afAddr16Bit;

    dstAddr.addr.shortAddr = 0;   // Coordinator makes the match

    ZDP_EndDeviceBindReq( &dstAddr, NLME_GetShortAddr(),

                           SAMPLESW_ENDPOINT,

                           ZCL_HA_PROFILE_ID,

                           0, NULL,   // No incoming clusters to bind

                           ZCLSAMPLESW_BINDINGLIST, bindingOutClusters,

                           TRUE );

  }

 

  if ( keys & HAL_KEY_SW_3 )

  {

  }

 

  if ( keys & HAL_KEY_SW_4 )

  {

    HalLedSet ( HAL_LED_4, HAL_LED_MODE_OFF );

 

    // Initiate a Match Description Request (Service Discovery)

    dstAddr.addrMode = AddrBroadcast;

    dstAddr.addr.shortAddr = NWK_BROADCAST_SHORTADDR;

    ZDP_MatchDescReq( &dstAddr, NWK_BROADCAST_SHORTADDR,

                       ZCL_HA_PROFILE_ID,

                       ZCLSAMPLESW_BINDINGLIST, bindingOutClusters,

                       0, NULL,   // No incoming clusters to bind

                       FALSE );

  }

}

聪明的同学一看就明白了,哦,原来如此简单啊,那我是不是只要这么添加就成了:

if ( keys & HAL_KEY_SW_6 )

{

   处理函数…

}

没有错,杀人越货居家旅行必备的天下第一奇毒秘密配方已尽收你眼底了,哈哈。OK,修改之后编译下载,大功告成,按下按键,等待见证奇迹的时刻。咦,咋什么反应都没???

呵呵,是不是有种想要砸电脑的感觉,Zstack协议栈确实相当令人各种厌烦,除了以上的配置,还有两个要注意的地方。在hal_board_cfg.h文件中,有下面两句预编译语句:

/* S1 */

#define PUSH1_BV          BV(1)

#define PUSH1_SBIT         P0_1

这时你心想,这不是S1么,跟S6有毛的关系啊!咦,不对啊,Zstack默认的的SW6不是对应着P0.1么,怎么这里的S1也关联到P0.1去了。呵呵,这个其实是TI的不对了,确实这里的S1和刚才的SW6是一回事,就让我们尽情地对着TI的协议栈送上各种“美好的”问候词吧。在hal_key.c中,也可以看到:

if (HAL_PUSH_BUTTON1())

{

  keys |= HAL_KEY_SW_6;

}

是不是憋不住想骂人了,淡定淡定。我们把hal_board_cfg.h中的那两个预编译代码进行相应的修改:

/* S1 */

#define PUSH1_BV          BV(7)

#define PUSH1_SBIT         P0_7

编译下载,按下按键,此刻,屏幕缓缓变黑,最后留下一行颇有深意的文字:To be continued…

影迷们请尽情期待13年悬疑大剧的下一集。


    
[3] 调用ITelephony的endCall( )步骤自动挂断电话
    来源: 互联网  发布时间: 2014-02-18
调用ITelephony的endCall( )方法自动挂断电话

这只是时长三个月左右的Android培训, 所以学到的都是应用层面的东东(自己以为), 不可能对整个Android进行系统深入的讲解. 


------------------------

各种来电防火墙之类的功能都可以过滤掉黑名单中的来电, 原理是响铃是判断来电号码是否存在于黑名单中, 如果存在则将其挂断. 而一些软件可以选择被挂断的家伙听到的提示音是"正在通话中"还是"欠费停机"之类的, 则是通过判断之后用运营商的"呼叫转移"功能将号码转接给一个已经停机的号码来实现的. 


挂断一个电话在API-10和之前版本中直接调用TelephonyManager对象的endCall方法即可, 但是之后的版本中这个API不再被公开(升级后的Android系统中还存在, 但是在Android SDK中不再提供给开发者* ). 


还想忤逆股沟的意思来调用它的话, 大概有两中方式: 

第一种: 自己定制android.jar文件. 这种方法不用每次用到"非公开"的API都在代码中费一番功夫. 这里http://mogoweb.net/archives/87 有非常详细的说明. 

第二种: 用反射. (有两种方法): 

package com.example.hanguptest;

import java.lang.reflect.Method;

import android.app.Activity;
import android.os.Bundle;
import android.os.IBinder;
import android.telephony.TelephonyManager;
import android.view.View;
import android.widget.Toast;

import com.android.internal.telephony.ITelephony;


public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}

	public void hangUp1(View v) throws Exception{
		Toast.makeText(getApplicationContext(), "hangUp1", 0).show();
		
		TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
		
		Class tmClazz = tm.getClass();
		
		Method getITelephonyMethod = tmClazz.getDeclaredMethod("getITelephony", null);
		getITelephonyMethod.setAccessible(true);
		
		ITelephony iTelephony = (ITelephony) getITelephonyMethod.invoke(tm, null);
		
		iTelephony.endCall();
	}	
	
	/**
	 * @param v
	 * @throws Exception
	 */
	public void hangUp2(View v) throws Exception{
		Toast.makeText(getApplicationContext(), "hangUp1", 0).show();
		
		Class clazz = Class.forName("android.os.ServiceManager");
		
		Method getServiceMethod = clazz.getMethod("getService", String.class);
		
		IBinder iBinder = (IBinder) getServiceMethod.invoke(null, TELEPHONY_SERVICE);
		
		ITelephony iTelephony = ITelephony.Stub.asInterface(iBinder);
		
		iTelephony.endCall();
	}	
	
}


-----------------------

注: * 在模拟器和手机上的system/framework/framework.jar中存在, 但是在SDK的sdk\platforms\android-X\android.jar中被移除了. 


----

看了这两篇文章, 收获也很大. 

http://blog.csdn.net/louiswangbing/article/details/6607418

http://www.linuxidc.com/Linux/2011-11/46416.htm



    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
docker中文入门学习手册 iis7站长之家
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3