android题库
1、简述如何在界面中自定义绘画内容;
i.定义一个自定义的View组件
1.新建一个类继承View类
2.重写onDraw(Canvas canvas)方法
public class MyView extends View(){
Public MyView(Context context){
Super(context);
}
Protected void onDraw(Canvas canvas){
//绘画内容
}
}
ii.调用自定义View
1.Public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
SetContentView(new MyView(this));
}
2、列举在View中常用的画几何图形的方法;
iii.不规则矩形(RectF)
RectF rectF = new RectF(left,top,right,bottom);
left:矩形的左边框到手机屏幕左边框的距离
top:矩形的上边框到手机屏幕上边框的距离
right:矩形的右边框到手机屏幕左边框的距离
bottom:矩形的下边框到手机屏幕上边框的距离
iv.规则矩形(Rect)
Rect rect = new Rect(left,top,right,bottom);//参数意义同上
v.//椭圆
canvas.drawOval(rectF,paint);//参数(定义一个矩形设置椭圆的位置,画笔);
vi.//扇形
canvas.drawArc(arg1,arg2,arg3,arg4,arg5)//参数(定义一个扇形的位置,扇形
一条边与X轴所成的角度,扇形的最大弧度,样式(true/false),画笔);
vii.//圆形
canvas.drawCircle(arg1,arg2,arg3,arg4,arg5);//参数(left,top(相当于圆心的
坐标),半径);
viii.//文本内容
canvas.drawText(arg1,arg2,arg3,arg4);//参数(文本内容,left,top,画笔);
ix.//线条
canvas.drawLine(arg1,arg2,arg3,arg4,arg5);//参数(left,top,right,bottom,
画笔)
3、在Android中使用什么类来描述图像对象,图像对象的加载方式和绘画方式有哪些;
i.使用Bitmap类来描述图像对象
ii.常用的加载方式:
1.从系统资源中加载
Bitmap bitmap =
BitmapFactory.decodeResource(context.getResources(),R.drawable.photo);
2.通过资源文件路径加载assets目录下面的资源文件
Bitmap bitmap2=
BitmapFactory.decodeStream(context.getAssets().open("weather/a_1.gif"));
注:图片文件放在项目中的assets目录下;
3.从sdcard卡中加载
Bitmap bitmap = BitmapFactory.decodeFile(“/sdcard/dcim/photo.jpg”);
4.从另一个Bitmap对象中加载
a)从bitmapA对象的图片数据中取出一部分加载到bitmapB对象中:
Bitmap bitmapB =Bitmap.createBitmap(截取区域的起始点x坐标, 截取区
域的起始点y坐标, 截取区域终点x坐标, 截取区域终点y坐标);
b)将bitmapA对象的图片缩放成100*50的尺寸加载到bitmapB对象中
Bitmap bitmapB =Bitmap.createScaledBitmap(bitmapA,缩放后的宽度, 缩放
后的高度,false);
5.压缩原图片形成容量较小的Bitmap
ByteArrayOutputStream bos=new ByteArrayOutputStream();
https://www.360docs.net/doc/19863528.html,press(CompressFormat.PNG, 75, bos);
Bitmap bitmap5=BitmapFactory.decodeByteArray(bos.toByteArray(), 0,
bos.toByteArray().length);
x.绘画方式
1.canvas.drawBitmap(bitmap,X坐标,Y坐标);
4、简述使用Matrix对图像进行变换的基本步骤;
b)Matrix概念:即矩阵,线性代数中的一个术语,在android中用于描述图像的平移、
旋转、缩放、倾斜等信息。
i.相关方法:
setTranslate(平称到的x坐标,平移到的y坐标);
setRotate(旋转的角度);//以图像所在矩形区域的左上角为旋转轴心旋转
setRotate(旋转的角度,旋转轴心的x坐标,旋转轴心的y坐标);
setScale(在x轴方向的缩放比例,在y轴方向的缩放比例,缩放参照点x坐标,
缩放参照点y坐标);
setSkew(在x轴方向的倾斜值,在y轴方向的倾斜值,倾斜参照点x坐标,倾斜
参照点y坐标);
ii.使用方法:
通常实例化一个Matrix对象来定义一种属性(平移、旋转、缩放、倾斜中的一种),多个Matrix对象的属性可以叠加在另一个Matrix对象中
如:
Matrix translateMatrix=new Matrix();//定义一个用于平移的矩阵
translateMatrix.setTranslate(50,50);//设置平移属性
Matrix rotateMatrix=new Matrix();//定义一个用于旋转的矩阵
rotateMatrix.setRotate(45,50+bimap.getWidth()/2,50+bitmap.getHeight()/2);//以
左上角锚点位于(50,50)的图像中心作为轴心旋转45度
Matrix resultMatrix=new Matrix();//定义一个用于保存上面两矩阵叠加效果
的矩阵
resultMatrix.setConcat(rotateMatrix,translateMatrix);//注意两矩阵的摆放顺序,如先平移再旋转,则定义平移属性的矩阵放后面,定义旋转属性的矩阵放前
面
canvas.drawBitmap(bitmap,resultMatrix,paint);//利用矩阵在(50,50)位置画一个
沿其中心旋转45度的图像
Matrix对象中原有信息的清除:
resultMatrix.reset();
5、能否在Activity主线程以外的其他线程中刷新Activity界面中的组件内容?如不能,如何解决此问题;
i.在Android里面,View的操作是同步的,即产生View的线程才能对该View
进行操作,如刷新里面的内容,调用View的方法等。如果要异步操作View(即
在其他线程中操作该View),会报异常:Only the original thread that created a
view hierarchy can touch its views.
ii.解决方法:借助Handler将异步操作转化为同步操作,异步的线程借助Handler 发出操作的请求(消息),在创建View的线程有空时取出消息进行处理
(handleMessage())
6、对于需要快速刷新的界面,应使用什么样的View来实现,它的特点是什么;
i.通常使用Surface
ii.特点:
1.双缓冲机制,将要显示的内容绘画完毕之后,才一次性的显示出来,可避
免出现“闪屏”现象;
2.android从底层对SurfaceView提供GPU加速,可使其比其他View的绘
画进行得更快
7、简述SurfaceView SurfaceHolder 和Surface 之间的关系;
i.SurfaceView是从View中派生出来的子类,是一种特殊的View,用于提供给
类似于游戏等需要快速刷新页面的应用程序;
ii.Surface是android图形系统中的一个重要的概念,View及其子类(如TextView 和Button等)都需要绘制在Surface上,每个Surface创建一个Canvas对象,
用于管理View和Surface上的绘图操作;
iii.SurfaceHolder:通常在绘图之间使用surfaceholder.lockCanvas();方法获得画布Canvas ;然后在绘画结束后使用surfaceholder.unlockCanvasAndPost();方法
提交绘画内容,显示到画布上;
8、Android中的动画效果分为哪几种,简述各种动画的效果的适用场合;
i.Tween动画
1.Alpha动画呈现透明度渐变效果
2.Scale动画呈现缩放的效果
3.Translate动画呈现平移的效果
4.Rotate动画呈现旋转的效果
ii.Frame动画:也称为帧动画,是指动画由一帧帧已有的图片组成,将图片依次且快速的在同一位置显示;
iii.自定义动画:用于实现难度大或者过程繁琐的动画效果;
9、如何实现自定义动画;
i.在SurfaceView中播放自定义动画的方式:在SurfaceView中处理绘画时,通
常会单独启用一个绘画线程,在线程中循环刷新从SurfaceHodler中获得的
Canvas,每次循环绘制动画中的一帧图像,每两次循环之间线程的休眠时间就
是一帧动画图像持续显示的时间;
10、简述android中按键事件的传递机制;
i.keyEvent的处理机制:
Activity 获取KeyEvent
-->将KeyEvent传递给子View
-->子View将KeyEvent向下传递到它自己的子View
....-->一直传递到当前具有焦点的View
获得焦点的View执行onKeyDown ,onKeyUp等处理按键的事件
如果View的按键事件处理后返回false或super.onKeyDown(.),则KeyEvent
会回传给Activity处理,如果返回true则表示按键事件处理到此结束,不会回传11、View组件能捕获到按键事件的条件是什么,如何满足该条件;
i.捕获的条件:View获得焦点
ii.view.setFocusable(true);//设置可以获得焦点
iii.view.requestFocus();//请求获得焦点
12、Android中处理按键事件时应当注意哪些特殊按键;
i.返回键:Activity的默认onKeyDown方法和onKeyUp方法中对返回键值进行
了特殊的处理,如果其onKeyDown方法和onKeyUp方法中任意一个未被调用
到,则原有对返回键的处理功能将会被破坏。因此,当MyView没有获取到焦
点或者到获取到了焦点但KeyEvent接口方法未返回true值时,点击返回键会
隐藏当前Activity,否则返回键失去次功能;
ii.摘机键:类似于返回键,当MyView没有获取到焦点或MyView获取到了焦点但是KeyEvent接口方法均未返回true值时,点击摘机键可以调出通话记录
Activity对应的界面,否则摘机键失去此功能;
iii.挂机键和电源键:挂机键和电源键不受MyView是否获取到焦点的影响,也不能被捕获到键值,当他们被点击后都会将模拟器切换到锁屏的状态。锁屏后再
次点击摘机键并解锁,会回到KeyEventActivity界面,但是,此时MyView焦
点已失去,点击返回键、摘机键均可正常调用其默认功能;
iv.HOME键:HOME键不会受MyView是否获取到焦点的影响,也不能被捕获到键值,一旦被点击则直接将界面切换到桌面;
13、Android中触摸事件有哪些动作类型?一个手势从产生到结束包含哪些动作类型;
ACTION_DOWN 第一个触点按下
ACTION_MOVE 触点移动
ACTION_POINTER_DOWN 其他触点按下
ACTION_POINTER_UP 某一触点弹起(至少还有一个触点未弹起)
ACTION_UP 最后一个触点弹起
14、如何从多点触摸中获取到各触点的信息;
i.MotionEvent中的action值由高八位(左边的八位二进制数值)和低八位(右边的
八位二进制数值)组成,高八位表示产生该触摸事件的触点id的值,低八位表
示该触摸事件的类型
(ACTION_DOWN,ACTION_MOVE,ACTION_POINTER_DOWN,ACTION_PO
INTER_UP,ACTION_UP)
int action=event.getAction();
ii.移位的方式获取信息:
0000001000000101<<8得到00000101
int realAction=action<<8;
或int realAction=action< int id=action>>8; 或int id=action>>ACTION_POINTER_ID_SHIFT; iii.API方法获取: int realAction=action&MotionEvent.ACTION_MASK; int id=event.getPointerId(pointerIndex); 15、如何彻底的结束一个android程序; i.对应程序中所有的Activity调用finish()方法,然后执行System.exit(0);退出整 个应用程序; 退出应用程序的具体代码如下: Public class ExitUtil(){ Private ArrayList Private static ExitUtil instance; Private ExitUtil(){ } //单例模式获取唯一的ExitUtil实例 Public static ExitUtil getInstance(){ If(null==instance){ Instance = new ExitUtil(); } Return instance; } //添加Activity到容器中 Public void addActivity(Activity activity){ activityList.add(activity); } //遍历所有Activity并finish Public void exit(){ For(Activity activity:activityList){ Activity.finish(); } System.exit(0); } } ii.使用每一个Activity时的onCreate方法中添加该Activity对象到ExitUtil对象实例容器中, ExitUtil.getInstance().addActivity(this); 在需要结束所有Activity时调用exit方法: ExitUtil.getInstance().exit();