android发布说说
来源:励志电影 发布时间:2013-02-09 点击:
android发布说说篇一
Android 说说Animation(一)
Android 说说Animation(一)
其实Android给我们的有两类自定义动画方式:
第一类:Frame By Frame 帧动画( 不推荐游戏开发中使用)
所谓帧动画,就是顺序播放事先做好的图像,类似于放电影;
分析: 此种方式类似我之前的那种利用设置可视区域的方式来实现动画效果,不仅类似而且还不如!所以此种方式在此不予分析;
第二类:Tween Animation 渐变动画
即通过对对象不断做图像变换(平移、缩放、旋转)产生动画效果!实现方式其实就是预先定义一组指令,这些指令指定了图形变换的类型、触发时间、持续时间。这些指令可以是以 XML 文件方式定义,也可以是以源代码方式定义。程序沿着时间线执行这些指令就可以实现动画 效果。
总结:那么在Android 游戏开发中我们优先选用两种方式:第一种设置可视区域的方式来实现动画效果(帧动画),需要童鞋们手动实现,在讲述SurfaceView添加动画之前,我们先来看看在View中如何实现Tween Animation以及Tween 中的四种效果;
MyViewAnimation .Java
java代码:Java代码packagedemo.Animation;
importandroid.content.Context; importandroid.graphics.Bitmap; importandroid.graphics.BitmapFactory; importandroid.graphics.Canvas; importandroid.graphics.Color; importandroid.graphics.Paint; importandroid.view.KeyEvent; importandroid.view.View;
{android发布说说}.
importandroid.view.animation.AlphaAnimation; importandroid.view.animation.Animation; importandroid.view.animation.RotateAnimation; importandroid.view.animation.ScaleAnimation; importandroid.view.animation.TranslateAnimation; /** *@authorHimi *@AlphaAnimation渐变透明度动画效果 *@ScaleAnimation渐变尺寸伸缩动画效果 *@TranslateAnimation画面转换位置移动动画效果 *@RotateAnimation画面转移旋转动画效果 */ publicclassMyViewAnimationextendsView{ privatePaintpaint; privateBitmapbmp; privateintx=50; privateAnimationmAlphaAnimation; privateAnimationmScaleAnimation; privateAnimationmTranslateAnimation; privateAnimationmRotateAnimation; publicMyViewAnimation(Contextcontext){ super(context); paint=newPaint(); paint.setAntiAlias(true); bmp=BitmapFactory.decodeResource(getResources(),R.drawable.icon); this.setFocusable(true);//只有当该View获得焦点时才会调用onKeyDown方法 } @Override protectedvoidonDraw(Canvascanvas){ super.onDraw(canvas); canvas.drawColor(Color.BLACK); paint.setColor(Color.WHITE); canvas.drawText("Himi",x,50,paint);//备注1 canvas.drawText("方向键↑渐变透明度动画效果",80,this.getHeight()-80,paint); canvas.drawText("方向键↓渐变尺寸伸缩动画效果",80,this.getHeight()-60,paint); canvas.drawText("方向键←画面转换位置移动动画效果",80,this.getHeight()-40,paint); canvas.drawText("方向键→画面转移旋转动画效果",80,this.getHeight()-20,paint); canvas.drawBitmap(bmp,this.getWidth()/2-bmp.getWidth()/2, this.getHeight()/2-bmp.getHeight()/2,paint); x+=1; } publicbooleanonKeyDown(intkeyCode,KeyEventevent){ if(keyCode==KeyEvent.KEYCODE_DPAD_UP){//渐变透明度动画效果 mAlphaAnimation=newAlphaAnimation(0.1f,1.0f);
{android发布说说}.
//第一个参数fromAlpha为动画开始时候透明度 //第二个参数toAlpha为动画结束时候透明度 //注意:取值范围[0-1];[完全透明-完全不透明] mAlphaAnimation.setDuration(3000); ////设置时间持续时间为3000毫秒=3秒 this.startAnimation(mAlphaAnimation); }elseif(keyCode==KeyEvent.KEYCODE_DPAD_DOWN){//渐变尺寸伸缩动画效果 mScaleAnimation=newScaleAnimation(0.0f,1.5f,0.0f,1.5f,Animation.RELATIVE_TO_PARENT,0.5f,Animation.RELATIVE_TO_PARENT,0.0f);
//第一个参数fromX为动画起始时X坐标上的伸缩尺寸
//第二个参数toX为动画结束时X坐标上的伸缩尺寸
//第三个参数fromY为动画起始时Y坐标上的伸缩尺寸
//第四个参数toY为动画结束时Y坐标上的伸缩尺寸
//注意:
//0.0表示收缩到没有
//1.0表示正常无伸缩
//值小于1.0表示收缩
//值大于1.0表示放大
//-----我这里1-4参数表明是起始图像大小不变,动画终止的时候图像被放大1.5倍 //第五个参数pivotXType为动画在X轴相对于物件位置类型
//第六个参数pivotXValue为动画相对于物件的X坐标的开始位置
//第七个参数pivotXType为动画在Y轴相对于物件位置类型
//第八个参数pivotYValue为动画相对于物件的Y坐标的开始位置
//提示:位置类型有三种,每种效果大家自己尝试哈~这里偷下懒~
//毕竟亲眼看到效果的区别才记忆深刻~
//Animation.ABSOLUTE、Animation.RELATIVE_TO_SELF、Animation.RELATIVE_TO_PARENT
mScaleAnimation.setDuration(2000);
this.startAnimation(mScaleAnimation);
}elseif(keyCode==KeyEvent.KEYCODE_DPAD_LEFT){//画面转换位置移动动画效果
mTranslateAnimation=newTranslateAnimation(0,100,0,100); //第一个参数fromXDelta为动画起始时X坐标上的移动位置 //第二个参数toXDelta为动画结束时X坐标上的移动位置 //第三个参数fromYDelta为动画起始时Y坐标上的移动位置 //第四个参数toYDelta为动画结束时Y坐标上的移动位置 mTranslateAnimation.setDuration(2000); this.startAnimation(mTranslateAnimation); }elseif(keyCode==KeyEvent.KEYCODE_DPAD_RIGHT){//画面转移旋转动画效果 mRotateAnimation=newRotateAnimation(0.0f,360.0f, Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f); //第一个参数fromDegrees为动画起始时的旋转角度 //第二个参数toDegrees为动画旋转到的角度 //第三个参数pivotXType为动画在X轴相对于物件位置类型 //第四个参数pivotXValue为动画相对于物件的X坐标的开始位置{android发布说说}.
//第五个参数pivotXType为动画在Y轴相对于物件位置类型
//第六个参数pivotYValue为动画相对于物件的Y坐标的开始位置 mRotateAnimation.setDuration(3000);
this.startAnimation(mRotateAnimation);
}
returnsuper.onKeyDown(keyCode,event);
}
}
android发布说说篇二
Android 说说命令行参数
Android 说说命令行参数
Android SDK最重要的仿真器程序emulator,除了前面介绍的-avd参数(指定Android硬件装置与目标平台)、-sdcard参数(在仿真器启动时抓取SD存储卡)或-skin参数(指定仿真器以不同分辨率与显示方向)外,emulator还有相当多的参数可供启动Android仿真器时采用。
emulator -timezone Asia/Shanghai
启动Android仿真器时,一般情况仿真器会自动去检测当地时间,但是若检测错误时造成时区不对,则可以使用-timezone参数指定时区为亚洲上海Asia/Shanghai,-timezone它的格式为Area/Location,例如Asia/Tokyo、America/Los_Angeles或Europe/Paris。
emulator -no-boot-anim
如果想要快一点启动仿真器,则可以使用 -no-boot-anim省略掉每次开机时的Android logo动画画面,不过实际的仿真器运行速度还是主要取决于计算机硬件配置。
emulator -scale auto
emulator -scale factor (factor: 0.1-3.0)
可以使用-scale参数调整仿真器窗口的大小。如果使用-scale auto则仿真器会自动依照计算机屏幕的分辨率来调整适当的仿真器窗口大小;如果不满意的话,则使用scale factor给予0.1~3.0之间的数值,来调整仿真器窗口的大小,例如emulator -scale 1.5。
emulator -dpi-device 300
-dpi-device可以更改仿真器的显示分辨率,内定值为165 dpi,可以改成150 dpi、200 dpi、300 dpi等数字来指定仿真器画面分辨率。
emulator -skin <skinID>
也可以使用-skin参数来指定Android仿真器内定的4种显示模式,请将 <skinID> 改为任何一种模式:HVGA-L (480×320, 水平显示)、HVGA-P (320×480, 垂直显示,此为内定模式)、QVGA-L (320×240, 水平显示)或QVGA-P (240×320, 垂直显示)。
emulator -help-keys
-help-keys会显示操作Android仿真器时的键盘快捷键帮助,例如按键盘上的Home键就回到主画面、F2为仿真器上的MENU按键、F3拨电话、F4退出通话、ESCAPE为返回键,F5搜寻功能、F8开启或关闭3G网络功能、Ctrl-F5/F6控制音量大小,Ctrl+F11/F12旋转显示画面为垂直或水平等常用的快捷键。
emulator -shell
-shell参数相当于adb shell功能,在启动Android仿真器的同时,还开启了一个的终端机模式,可以在Android操作系统中使用命令列指令。
emulator -data imagefile
emulator -sdcard imagefile
emulator -cache imagefile
使用-data或-sdcard参数之前,必须先使用mksdcard指令生成image file,例如mksdcard 4096M data.img,然后运行emulator -data data.img时,Android系统的/data目录就会使用
data.img的文件空间。事实上,Android系统将使用者的/data信息默认放在userdata-qemu.img文件,如果是Windows版本SDK,可以在目录C:\Documents and Settings\<user>\.android\avd查找这个文件,如果是linux/Mac版本的SDK,则可以在~/.android/avd查找这个
userdata-qemu.img文件。同理,emulator -sdcard sdcard.img则会让Android系统的/sdcard目录使用sdcard.img的文件空间,而emulator -cache cache.img则可以当做浏览器的暂保存保存空间。
emulator -wipe-data
-wipe-data参数会将Android仿真器恢复到出厂设置,所有 /data的文件与个人信息都会被删除,所以在运行emulator -wipe-data前,确定真的不要所有的信息,以及先前安装好的APK应用程序了,才进行系统清除动作。
emulator -help
emulator指令的参数选项还非常的多,您可以运行emulator -help获得更多的参数功能。
android发布说说篇三
Android开发——说说Adapter那点事
Adapter在Android中占据一个重要的角色,它是数据和UI(View)之间一个重要的纽带。在常见的View(ListView,GridView)等地方都需要用到Adapter。如图1直观的表达了Data、Adapter、View三者的关系。
图1 Adapter、数据、UI三者关系(PS:此图来自Google I/O)
一、Android中Adapter
图2:Android中Adapter类型层级图
由图2我们可以看到在Android中与Adapter有关的所有接口、类的完整层级图。在我们使用过程中可以根据自己的需求实现接口或者继承类进行一定的扩展。比较常用的有 BaseAdapter,ArrayAdapter,SimpleCursorAdapter等。
Base
Adap
ter是
一个
抽象
类,
继承它需要实现较多的方法,所以也就具有较高的灵活性; Arra
yAdapter支持泛型操作,通常需要实现getVi
ew方法,特殊情况下(结合数据row id),为了让ui事件相应处理方便点最好重写getItemId; Sim
pleCursor
Adapter可以适用于简单的纯文字型ListView,它需要Cursor的字段和UI的id对应起来。如需要实现更复杂的UI也可
android发布说说篇四
Android 说说Animation(三)
Android 说说Animation(三)
main.xml中的代码
Java代码:XML/HTML代码<?xmlversion="1.0"encoding="utf-8"?>
<LinearLayoutxmlns:android="
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1">
<com.himi.MySurfaceViewandroid:id="@+id/view3d"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
<com.himi.MyViewandroid:id="@+id/myview"{android发布说说}.
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
</RelativeLayout>
</LinearLayout>
xml中我们注册了我们自定义的view-MyView 和 SurfaceView-MySurfaceView;
需要强调的有两点:
1 : 当我们xml中注册我们的View时,我们View类中的构造函数必须要用
public MyView(Context context, AttributeSet attrs) {} 两个参数的形式,以前的文章有讲解。
2 : 当我们在Xml中注册两个View的时候,它们显示的次序就是根据xml注册的顺序来显示,比如上面我们先注册了MySurfaceView,然后注册的MyView ,那么显示的时候会把后添加进去的MyView显示在最上层!
下面我们来看MySurfaceView.java中的代码:
java代码:
JAVA代码 packagedemo;
{android发布说说}.
importandroid.graphics.Canvas; importandroid.graphics.Color; importandroid.graphics.Paint; importandroid.util.AttributeSet; importandroid.view.KeyEvent; importandroid.view.SurfaceHolder; importandroid.view.SurfaceView; importandroid.view.SurfaceHolder.Callback; /** * *@authorHimi * */ publicclassMySurfaceViewextendsSurfaceViewimplementsCallback,Runnable{ publicstaticMySurfaceViewmsrv;//----备注1 privateintmove_x=2,x=20; privateThreadth; privateSurfaceHoldersfh; privateCanvascanvas; privatePaintp; publicMySurfaceView(Contextcontext,AttributeSetattrs){ super(context,attrs); msrv=this; p=newPaint(); p.setAntiAlias(true); sfh=this.getHolder(); sfh.addCallback(this); th=newThread(this); this.setKeepScreenOn(true); this.setFocusable(true);//----备注2 } publicvoidsurfaceCreated(SurfaceHolderholder){ th.start(); } publicvoiddraw(){ canvas=sfh.lockCanvas(); if(canvas!=null){ canvas.drawColor(Color.WHITE); canvas.drawText("我是-Surfaceview",x+move_x,280,p); sfh.unlockCanvasAndPost(canvas); } } privatevoidlogic(){
if(x>200||x<80){ move_x=-move_x; } } @Override publicbooleanonKeyDown(intkey,KeyEventevent){//备注2
returnsuper.onKeyDown(key,event);
}
publicvoidrun(){
//TODOAuto-generatedmethodstub
while(true){
draw();
logic();
try{
Thread.sleep(100);
}catch(Exceptionex){
}
}
}
publicvoidsurfaceChanged(SurfaceHolderholder,intformat,intwidth,
intheight){
}
publicvoidsurfaceDestroyed(SurfaceHolderholder){
}
}
代码都很熟悉了, 主要我们来给大家解释下备注1,备注2:
备注1:
我在两个MyView 和 MySurfaceView中都定义了本类一个静态对象,然后在初始化的时候都利用=this的形式进行了实例化;
注意:=this; 的这种实例形式要注意!只能在当前程序中仅存在一个本类对象才可使用! 为什么要实例两个View的实例而且定义成静态,这样做主要为了类之间方便调用和操作!比如在我们这个项目中,我这样做是为了在MainActivity中去管理两个View按键焦点!下面我会给出MainActivity的代码,大家一看便知;
备注2:
我在两个MyView 和 MySurfaceView中都对获取按键焦点注释掉了,而是在别的类中的调用其View的静态实例对象就可以任意类中对其设置!这样就可以很容易去控制到底谁来响应按键了。
这里还要强调一下:当xml中注册多个 View的时候,当我们点击按键之后,Android会先判定哪个View setFocusable(true)设置焦点了,如果都设置了,那么Android 会默认响应在xml中第一个注册的view ,而不是两个都会响应。那么为什么不同时响应呢?我解释下:
上面这截图是Android SDK Api的树状图,很明显SurfaceView继承了View,它俩是基继承关系,那么不管是子类还是基类一旦响应了按键,其基类或者父类就不会再去响应;
下面我们来看MainActivity.java:
java代码:Java代码packagedemo;
importandroid.app.Activity;
importandroid.os.Bundle;
importandroid.view.KeyEvent;
importandroid.view.Window;
importandroid.view.WindowManager;
/**
*
*@authorHimi
*
*/
publicclassMainActivityextendsActivity{
/**Calledwhentheactivityisfirstcreated.*/
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.main);
MySurfaceView.msrv.setFocusable(false);//备注1
MyView.mv.setFocusable(true);//备注1
}
@Override
publicbooleanonKeyDown(intkeyCode,KeyEventevent){//备注2
returnsuper.onKeyDown(keyCode,event);
}
}
推荐内容