android题库

android题库
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 activityList = new 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();

相关主题
相关文档
最新文档