当前位置:文档之家› Android群英传笔记——第六章:Android绘图机制与处理技巧(1)

Android群英传笔记——第六章:Android绘图机制与处理技巧(1)

Android群英传笔记——第六章:Android绘图机制与处理技巧(1)
Android群英传笔记——第六章:Android绘图机制与处理技巧(1)

Android群英传笔记——第五章:

Android Scroll分析(1)

一.屏幕的尺寸信息

屏幕的尺寸,主要还是因为Android的屏幕确实五花八门,所以在一定程度上的适配问题也是很捉急的,所以我们要对这块屏幕充分的认识

1.屏幕参数

一块屏幕通常具备以下的几个参数

屏幕大小

指屏幕对角线的长度,通常用寸来表示,例如4.7寸,5.5寸

分辨率

分辨率是指实际屏幕的像素点个数,例如720X1280就是指屏幕的分辨率,宽有720个像素点,高有1280个像素点

PPI

每英寸像素又称为DPI,他是由对角线的的像素点数除以屏幕的大小所得,通常有400PPI 就已经很6了

2.系统屏幕密度

每个厂商的安卓手机具有不同的大小尺寸和像素密度的屏幕,安卓系统如果要精确到每种DPI的屏幕,基本上是不可能的,因此系统定义了几个标准的DPI

3.独立像素密度dp

这是由于各种屏幕密度的不同,导致同样像素大小的长度,在不同密度的屏幕上显示长度不同,因此相同长度的屏幕,高密度的屏幕包含更多的像素点,在安卓系统中使用mdpi密度值为160的屏幕作为标准,在这个屏幕上,1px = 1dp,其他屏幕则可以通过比例进行换算,例如同样是100dp的长度,mdpi中为100px,而在hdpi中为150,我们也可以得出在各个密度值中的换算公式,在mdpi中1dp = 1px, 在hdpi中,1dp = 1.5px,在xhdpi中,1dp = 2px,在xxhdpi中1dp = 3px,由此可见,我们换算公司l:m:h:xh:xxh = 3:4:6:8:12

4.单位换算

在程序中,我们可以非常方便地对一些单位的换算,下面的代码给出了一种换算的方法我们可以把这些代码作为工具类保存在项目中

package com.lgl.playview;

import android.content.Context;

/**

* dp,sp转换成px的工具类

* Created by lgl on 16/3/23.

*/

public class DisplayUtils {

/**

* 将px值转换成dpi或者dp值,保持尺寸不变

*

* @param content

* @param pxValus

* @return

*/

public static int px2dip(Context content, float pxV alus) {

final float scale = content.getResources().getDisplayMetrics().density;

return (int) (pxV alus / scale + 0.5f);

}

/**

* 将dip和dp转化成px,保证尺寸大小不变。

*

* @param content

* @param pxValus

* @return

*/

public static int dip2px(Context content, float pxV alus) {

final float scale = content.getResources().getDisplayMetrics().density;

return (int) (pxV alus / scale + 0.5f);

}

/**

* 将px转化成sp,保证文字大小不变。

*

* @param content

* @param pxValus

* @return

*/

public static int px2sp(Context content, float pxV alus) {

final float fontScale = content.getResources().getDisplayMetrics().scaledDensity;

return (int) (pxV alus / fontScale + 0.5f);

}

/**

* 将sp转化成px,保证文字大小不变。

*

* @param content

* @param pxValus

* @return

*/

public static int sp2px(Context content, float pxV alus) {

final float fontScale = content.getResources().getDisplayMetrics().scaledDensity;

return (int) (pxV alus / fontScale + 0.5f);

}

}

其实的density就是前面所说的换算比例,这里使用的是公式换算方法进行转换,同时系统也提供了TypedValue帮助我们转换

/**

* dp2px

* @param dp

* @return

*/

protected int dp2px(int dp){

return

(int)TypedValue.applyDimension(https://www.doczj.com/doc/5b18645283.html,PLEX_UNIT_DIP,dp,getResources().getDispl ayMetrics());

}

/**

* sp2px

* @param dp

* @return

*/

protected int sp2px(int sp){

return

(int)TypedValue.applyDimension(https://www.doczj.com/doc/5b18645283.html,PLEX_UNIT_SP,sp,getResources().getDispla yMetrics());

}

二.2D绘图基础

系统通过提供的Canvas对象来提供绘图方法,它提供了各种绘制图像的API,drawLine,deawPoint,drawRect,drawVertices,drawAce,drawCircle等等,我以前写过Android 绘图机制(二)——自定义View绘制形, 圆形, 三角形, 扇形, 椭圆, 曲线,文字和图片的坐标讲解,通过他们的名字我们基本可以大致了解他们的功能,当然,Paint作为一个非常重要的元素功能也非常强大这里也简单地列举了一些他的属性Android绘图机制(一)——自

定义View的基础属性和方法

setAntiAlias(); //设置画笔的锯齿效果

setColor(); //设置画笔的颜色

setARGB(); //设置画笔的A、R、G、B值

setAlpha(); //设置画笔的Alpha值

setTextSize(); //设置字体的尺寸

setStyle(); //设置画笔的风格(空心或实心)

setStrokeWidth(); //设置空心边框的宽度

getColor(); //获取画笔的颜色

是由于画笔功能的不一样,再结合各种不同的绘图API,这样任意组合就可以实现不同的绘图效果,比如同样是矩形设置Paint就Style可以画出空心或者实心,我们来看看RectView package com.lgl.playview;

import android.content.Context;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.Paint;

import android.util.AttributeSet;

import android.view.View;

/**

* Created by lgl on 16/3/23.

*/

public class RectView extends View {

private Paint paint1,paint2;

public RectView(Context context, AttributeSet attrs) {

super(context, attrs);

initView();

}

private void initView() {

paint1 = new Paint();

paint1.setColor(Color.BLUE);

paint1.setAntiAlias(true);

//空心

paint1.setStyle(Paint.Style.STROKE);

paint2 = new Paint();

paint2.setColor(Color.BLUE);

//实心

paint2.setStyle(Paint.Style.FILL);

}

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

canvas.drawRect(50,100,300,300,paint1);

canvas.drawRect(350,400,700,700,paint2);

}

}

运行起来就是

三.Android XML 绘图

XML在安卓系统中可不仅仅是Java中的一个布局文件配置列表,在安卓开发者的手头上他甚至可以变成一张画,一幅画,Android开发者给XML提供了几个强大的属性

1.Bitmap

在XML中使用Bitmap很简单

android:src="@mipmap/ic_launcher">

通过这样引用图片就可以将图片直接转化成Bitmap让我们在程序中使用

2.Shape

通过Shape可以绘制各种图形,下面展示一下shape的参数

android:shape="rectangle">

android:bottomLeftRadius="1dp"

android:bottomRightRadius="1dp"

android:radius="1dp"

android:topLeftRadius="1dp"

android:topRightRadius="1dp" />

android:angle="1dp"

android:centerColor="@color/colorAccent"

android:centerX="1dp"

android:centerY="1dp"

android:gradientRadius="1dp"

android:startColor="@color/colorAccent"

android:type="linear"

android:useLevel="true" />

android:bottom="1dp"

android:left="1dp"

android:right="1dp"

android:top="1dp" />

android:width="1dp"

android:height="1dp" />

android:width="1dp"

android:color="@color/colorAccent" />

android:dashWidth= "1dp"

android:dashGap= "1dp"

shape可以说是xml绘图的精华所在,而且功能十分的强大,无论是扁平化,拟物化还是渐变,都是十分的OK,我们现在来做一个阴影的效果

android:shape="rectangle">

android:angle="45"

android:endColor="#805FBBFF"

android:startColor="#FF5DA2FF" />

android:bottom="7dp"

android:left="7dp"

android:right="7dp"

android:top="7dp" />

看效果

https://www.doczj.com/doc/5b18645283.html,yer

Layer是在PhotoShop中是非常常用的功能,在Android中,我们同样可以实现图层的效果

android:bottom="10dp"

android:top="10dp"

android:right="10dp"

android:left="10dp"

android:drawable="@mipmap/ic_launcher"

/>

4.Selector

Selector的作用是帮助开发者实现静态View的反馈,通过设置不同的属性呈现不同的效果

这一方法可以帮助开发者迅速制作View的反馈,通过配置不同的触发事件,selector会自动选中不同的图片,特别是自定义button的时候,而

我们不再使用原生单调的背景,而是使用selector特别制作的背景,就能完美实现触摸反馈了

通常情况下,上面提到的这些方法都可以共同实现,下面这个例子就展示了在一个selector 中使用shape作为他的item的例子,实现一个具体点

击反馈效果的,圆角矩形的selector,代码如下

我们来看一下效果图

四.Android绘图技巧

在学完Android的基本绘图之后我们来讲解一下常用的绘图技巧

1.Canvas

Canvas作为绘制图形的直接对象,提供了一下几个非常有用的方法

Canvas.save()

Canvas.restore()

Canvas.translate()

Canvas.roate()

首先,我们来看一下前面两个方法

在讲解这两个方法之前,首先来了解一下Android绘图的坐标体系,这个其实这个前面已经讲了,这里不赘述,而Canvas.save()这个方法,从字面上的意思可以理解为保存画布,他的作用就是讲之前的图像保存起来,让后续的操作能像在新的画布一样操作,这跟PS的图层基本差不多

而Canvas.restore()这个方法,则可以理解为合并图层,,就是讲之前保存下来的东西合并

而后面两个方法尼?从字母上理解画布平移或者旋转,但是把他理解为坐标旋转更加形象,前面说了,我们绘制的时候默认坐标点事左上角的起始点,那么我们调用translate(x,y)之后,则将原点(0,0)移动到(x,y)之后的所有绘图都是在这一点上执行的,这里可能说的不够详细,最典型的例子是画一个表盘了,那我们这里就演示一下画一个表盘

我们先来分析一下这个表盘有什么?我们可以将他分解

1.仪表盘——外面的大圆盘

2.刻度线——包含四个长的刻度线和其他短的刻度线

3.刻度值——包含长刻度线对应的大的刻度尺和其他小的刻度尺

4.指针——中间的指针,一粗一细两根

相信如果现实中叫你去画一个仪表盘的话,你应该也会这样的步骤去画,实际上Android上的绘图远比现实中的绘制十分的相似,与PS的绘图更家相似,当然,我们在绘制一个复杂的图形之后,不妨先把思路请清除了

这个示例中,我们第一步,先画表盘,现在画个圆应该很轻松了。关键在于确定圆心和半径,这里直接居中吧

// 画外圆

Paint paintCircle = new Paint();

paintCircle.setAntiAlias(true);

paintCircle.setStyle(Paint.Style.STROKE);

paintCircle.setStrokeWidth(5);

canvas.drawCircle(mWidth / 2, mHeight / 2, mWidth / 2, paintCircle);

下面,我们来画刻度尺,这个也很简单,一条线而已,只要确定两个端点的位置就可以,第一根线还是比较容易确定的,那后面的我们怎么去确定尼?那些斜着的我们可以用三角函数去实现计算,但是这其实就是一个很简单的画图,三角函数的运算也要这么多,我们不经要思考,该怎么去简化他尼?其实Google已经为我们想好了

我们治国与会觉得这个不好画,主要是这个角度,那么如果我们将画布以中心为原点旋转到需要的角度尼?每当画好一根线,我们就旋转多少级角度,但是下一次划线的时候依然是第

一次的坐标,但是实际上我们把画布重新还原到旋转钱的坐标了,所有的刻度线就已经画好了,通过旋转画布——实际上是旋转了画图的坐标轴,这就避免了万恶的三角函数了,通过这样一种相对论式的变换,间接简化了绘图,这时再去绘制这些刻度,是不是要简单了,只需要区别整点和非整点的刻度了

// 画刻度

Paint paintDegree = new Paint();

paintDegree.setStrokeWidth(3);

for (int i = 0; i < 24; i++) {

// 区别整点和非整点

if (i == 0 || i == 6 || i == 12 || i == 18) {

paintDegree.setStrokeWidth(5);

paintDegree.setTextSize(30);

canvas.drawLine(mWidth / 2, mHeight / 2 - mWidth / 2, mWidth,

mHeight / 2 - mWidth / 2 + 60, paintDegree);

String degree = String.valueOf(i);

canvas.drawText(degree,

mWidth / 2 - paintDegree.measureText(degree) / 2,

mHeight / 2 - mWidth / 2 + 90, paintDegree);

} else {

paintDegree.setStrokeWidth(3);

paintDegree.setTextSize(15);

canvas.drawLine(mWidth / 2, mHeight / 2 - mWidth / 2, mWidth,

mHeight / 2 - mWidth / 2 + 30, paintDegree);

String degree = String.val https://www.doczj.com/doc/5b18645283.html,ueOf(i);

canvas.drawText(degree,

mWidth / 2 - paintDegree.measureText(degree) / 2,

mHeight / 2 - mWidth / 2 + 60, paintDegree);

}

// 通过旋转画布简化坐标运算

canvas.rotate(15, mWidth / 2, mHeight / 2);

}

我们看看效果

紧接着,我们就可以来绘制两根针了,我们可以这样来绘制// 画指针

Paint paintHour = new Paint();

paintHour.setStrokeWidth(20);

Paint paintMinute = new Paint();

paintMinute.setStrokeWidth(10);

canvas.save(https://www.doczj.com/doc/5b18645283.html,);

canvas.translate(mWidth / 2, mHeight / 2);

canvas.drawLine(0, 0, 100, 100, paintHour);

canvas.drawLine(0, 0, 100, 200, paintMinute);

canvas.restore();

这样运行的效果就和最上面的效果图一样了,这里贴上完整的代码package com.lgl.dial;

import android.content.Context;

import android.graphics.Canvas;

import android.graphics.Paint;

import android.util.AttributeSet;

import android.view.View;

import android.view.WindowManager;

public class DialView extends View {

// 宽高

private int mWidth;

private int mHeight;

// 构造方法

public DialView(Context context, AttributeSet attrs) {

super(context, attrs);

// 获取屏幕的宽高

WindowManager wm = (WindowManager) getContext().getSystemService( Context.WINDOW_SERVICE);

mWidth = wm.getDefaultDisplay().getWidth();

mHeight = wm.getDefaultDisplay().getHeight();

}

@Override

protected void onDraw(Canvas canvas) {

// TODO Auto-generated method stub

super.onDraw(canvas);

// 画外圆

Paint paintCircle = new Paint();

paintCircle.setAntiAlias(true);

paintCircle.setStyle(Paint.Style.STROKE);

paintCircle.setStrokeWidth(5);

canvas.drawCircle(mWidth / 2, mHeight / 2, mWidth / 2, paintCircle);

// 画刻度

Paint paintDegree = new Paint();

paintDegree.setStrokeWidth(3);

for (int i = 0; i < 24; i++) {

// 区别整点和非整点

if (i == 0 || i == 6 || i == 12 || i == 18) {

paintDegree.setStrokeWidth(5);

paintDegree.setTextSize(30);

canvas.drawLine(mWidth / 2, mHeight / 2 - mWidth / 2,

mWidth / 2, mHeight / 2 - mWidth / 2 + 60, paintDegree);

String degree = String.valueOf(i);

canvas.drawText(degree,

mWidth / 2 - paintDegree.measureText(degree) / 2,

mHeight / 2 - mWidth / 2 + 90, paintDegree);

} else {

paintDegree.setStrokeWidth(3);

paintDegree.setTextSize(15);

canvas.drawLine(mWidth / 2, mHeight / 2 - mWidth / 2,

mWidth / 2, mHeight / 2 - mWidth / 2 + 30, paintDegree);

String degree = String.valueOf(i);

canvas.drawText(degree,

mWidth / 2 - paintDegree.measureText(degree) / 2,

mHeight / 2 - mWidth / 2 + 60, paintDegree);

}

// 通过旋转画布简化坐标运算

canvas.rotate(15, mWidth / 2, mHeight / 2);

}

// 画指针

Paint paintHour = new Paint();

paintHour.setStrokeWidth(20);

Paint paintMinute = new Paint();

paintMinute.setStrokeWidth(10);

canvas.save();

canvas.translate(mWidth / 2, mHeight / 2);

canvas.drawLine(0, 0, 100, 100, paintHour);

canvas.drawLine(0, 0, 100, 200, paintMinute);

canvas.restore();

}

}

https://www.doczj.com/doc/5b18645283.html,yer图层

Android中的绘图API,很大程度上都来自绘图的API,特别是借鉴了很多PS的原理,比如图层的概念,相信看过图层的也都知道是个什么样的,我们画个图来分析一下

Android通过saveLayer()方法,saveLayerAlpha()将一个图层入栈,使用restore()方法,restoreToCount()方法将一个图层出栈,入栈的时候,后面的所有才做都是发生在这个图层上的,而出栈的时候,则会把图层绘制在上层Canvas上,我们仿照API Demo来

@Override

protected void onDraw(Canvas canvas) {

// TODO Auto-generated method stub

super.onDraw(canvas);

canvas.drawColor(Color.WHITE);

mPaint.setColor(Color.BLUE);

canvas.drawCircle(150, 150, 100, mPaint);

canvas.saveLayerAlpha(0, 0,400,400,127,LAYER_TYPE_NONE);

mPaint.setColor(Color.RED);

canvas.drawCircle(200, 200, 100, mPaint);

canvas.restore();

}

当绘制两个相交的圆时,就是图层

接下来将图层后面的透明度设置成0-255不同值

我们分别演示127 255 0三个

五.Android图像处理之色彩特效处理

Android对于图片的处理,最常用的数据结构是位图——Bitmap,他包含了一张图片的所有数据,整个图片都是由点阵和颜色值去组成的,所谓的点阵就是一个包含像素的矩形,每一个元素对应的图片就是一个像素,而颜色值——ARGB,分别对应透明度红,绿,蓝,这四个通用的分量,他们共同决定了每个像素点显示的颜色

1.色彩矩阵分析

在色彩处理中,我们通常用三个角度描述一张图片

色调——物体传播的颜色

饱和度——颜色的纯度,从0-100来进行描述

亮度——颜色的相对,明暗程度

而在Android中,系统会使用一个颜色矩阵——ColorMatrix,来处理这些色彩的效果,Android 中的颜色矩阵是4X5的数字矩阵,他用来对颜色色彩进行处理,而对于每一个像素点,都有一个颜色分量矩阵来保存ARGB值

这些是这样归类的

第一行的abcde用来决定新的颜色值R——红色

第二行的fghij用来决定新的颜色值G——绿色

第三行的kimno用来决定新的颜色值B——蓝色

第四行的pqrst用来决定新的颜色值A——透明

这样划分好各自的范围之后,这些值就比较慢明确了,不过只这样说可能会比较抽象,我们通过几个小李子不断的去分析

首先,我们来看一下矩阵变换的计算公式,以R分量为例,计算过程是

R1 = a * R + b* G + c*B+d *A + e

如果让a = 1,b,c,d,e都等于0,那么计算的结果为R1 = R,因此我们可以构建一个矩阵

如果把这个矩阵公式带入R1 = AC,那么根据矩阵的乘法运算法则,可以得到R1 = R;因此,这个矩阵通常是用来作为初始的颜色矩阵来使用,他不会对原有颜色进行任何改变

那么当我们要变换颜色值的时候通常有两种方法,一个是直接改变颜色的offset,即修改颜色的分量。另一种方法直接改变RGBA值的系数来改变颜色分量的值。

-1.改变偏移量

从前面的分析中,可以知道要修改R1的值,只要将第五列的值进行修改即可,即改变颜色的偏移量,其它值保存初始矩阵的值,如图所示的颜色矩阵实现了这样的效果。

在上面这个矩阵中,我们修改了R,G,所对应的颜色偏移量,那么最后的处理结果,就是图像的红色绿色分别增加了100,而我们知道,红色混合绿色的到了黄色,所以最终的颜色处理结果就是让整个图片的色调偏黄色

-2.改变颜色系数

如果修改颜色分量中的某个系数值而其他只依然保存初始矩阵的值。

在上面这个矩阵中改变了G分量所对应的系数据g,这样在矩形运算后G分量会变成以前的两倍,最终效果就是图像的色调更加偏绿。

-3.改变色光属性

图像的色调,饱和度,亮度这三个属性在图像处理中使用的非常多,因此在颜色矩阵中也封装了一些API来快速调用这些参数,而不用每次都去计算矩阵的值。下面通过一个实例来看看如何通过句正改变图像的色调,饱和度和亮度。

在Android中,系统封装了一个类——ColorMatrix,也就是前面所说的颜色矩阵。通过这个类,可以很方便地通过改变矩阵值来处理颜色的效果,创建一个ColorMatrix对象非常简单代码如下。

ColorMatrix colorMatrix = new ColorMatrix();

下面我们来处理不同的色光属性

色调

安卓安卓系统提供了setRotate()帮助我们设置三个颜色的色调,第一个参数系统分别使用0,1,2来代表red green blue 三个颜色的处理而第二个参数就是需要处理的值了ColorMatrix colorMatrix = new ColorMatrix();

colorMatrix.setRotate(0, 2);

colorMatrix.setRotate(1, 4);

colorMatrix.setRotate(2, 3);

通过这样的方法,可以为RGB三个颜色的分量重新设置不同的值了

饱和度

Android开发的核心知识

想要学习移动应用的开发,除了必备的知识要掌握好之外,更多的是要掌握一些核心的基础知识,并且是能够起到关键性作用的知识点,必须是要了解清楚,如果你也是在学习Android开发,下面的核心基础或者对你有一定的帮助! 1.ListView的引入 为什么要采用listview?其实是在数据量过于庞大时,传统的存储方式它是会占用机器大量内存,最终导致OOM异常(内存溢出),listview的出现将会是有效的解决这个弊端的出现。 重点来了listview如何使用呢? res/layout布局文件中定义listview src的java代码里面关心控件findviewbyid(R.id.listview); 创建适配器对象,适配器继承baseAdapter接口 2.构造方法 getCount();控制listview的条目数 getView();得到当前条目视图 View.inflate();布局填充器 设置适配器:setAdapter(adapter); 设置listview列表项的点击事件:setOnClickLinsstener();

通知listview更新数据:adapter.notifyDataSetChanged(); 3.对话框的使用 *普通对话框 *单选对话框 *多选对话框 *进度对话框 *进度条对话框 *自定义对话框 布局填充器:Viewview=View.inflate(Context,https://www.doczj.com/doc/5b18645283.html,yout.dialog,null); 核心API:dialog.setView(view); 4.常见的一些适配器的使用 *数组适配器:ArrayAdapter *简单适配器:SimpleAdapter 5.数据库的常见的事务 为什么需要需要定义数据库事务?最主要的还是为了保证多条操作语句同步执行 6.数据库事务执行流程 db.beginTransaction();开启事务 db.setTransactionSuccessful();设置事务执行成功 db.endTransaction();结束事务 7.样式和主题 样式的作用在单独的UI控件上面 主题的作用它是在activity或者application上 以上的这些功能控件、数据库等这些是开发中必备的功能,在开发中只要这些基本的核心知识都掌握了,那么这对你接下里的进一步开发是比较有帮助的。

Android日历完整实现

实用第一智慧密集 2011. 05 实现基于Android 的日历系统 摘要: Android 作为目前较为流行的智能手机操作系统已成为大多数人的首选。在美国乃至世界 的很多地方的出货量已经超越Iphone,成为世界上最大智能手机操作系统。因此,世界各地的程 序员都跃跃欲试地想学习Android 的开发,并希望从中捞得属于自己的第一桶金。在此给出一个 基于Android 的日历系统的完整实现过程。 关键词: Android;日历;绘画;农历;记录;提醒 1 引言 要实现的日历除了常规的日历功能外,还可以显示与当前 日期相关的信息,如当前日期的农历日期、天干地支、节日等 信息。下面先看看日历的绚丽界面,如图1、图2 所示。 主要功能

2 绘画基础 由于实现的日历系统要涉及到大量的Android 绘图技术, 因此,要简单介绍Android 的绘图技术。 绘制图形通常在Android.view.View 或其子类的onDraw 方 法中进行。该方法的定义如下: protected void onDraw(Canvas canvas); 其中Canvas 对象提供了大量用于绘图的方法,这些方法 主要包括绘制像素点、直线、圆形、弧、文本,这些都是组成 复杂图形的基本元素。如果要画更复杂的图形,可以采用组合 这些图形基本元素的方式来完成。例如,可以采用画3 条直线 的方式来画三角形。下面来看一下绘制图形基本元素的方法。 2.1 绘制像素点 public native void drawPoint(float x, float y, Paint paint); // 画一个像素点 public native void drawPoints(float[] pts, int offset, int count, Paint paint); // 画多个像素点 public void drawPoints(float[] pts, Paint paint); // 画多个像素点 参数的含义如下: (1) x:像素点的横坐标。 (2) y:像素点的纵坐标。 (3) paint:描述像素点属性的Paint 对象。可设置像素点 的大小、颜色等属性。绘制其他图形元素的Paint 对象与绘制 像素点的Paint 对象的含义相同。在绘制具体的图形元素时可 根据实际的情况设置Paint 对象。 (4) pts: drawPoints 方法可一次性画多个像素点。pts 参数 表示多个像素点的坐标。该数组元素必须是偶数个,两个一组 为一个像素点的坐标。 (5) offset: drawPoints 方法可以取pts 数组中的一部分连 续元素作为像素点的坐标,因此,需要通过offset 参数来指定 取得数组中连续元素的第一个元素的位置,也就是元素偏移 量,从0 开始。例如,要从第3 个元素开始取数组元素,那么 offset 参数值就是2。 (6) count:要获得的数组元素个数, count 必须为偶数 (两个数组元素为一个像素点的坐标)。 要注意的是, offset 可以从任意一个元素开始取值,例如, offset 可以为1,然后count 为4。

Android应用开发基本知识点汇总

Android应用开发基本知识点汇总 Activity 一生命周期 4种状态 running / paused / stopped / killed 生命周期 Activity启动 onCreate -> onStart -> onResume 点Home返回主界面 onPause -> onStop 再次回到原Activity onRestart -> onStart -> onResume 退出Activity onPause -> onStop -> onDestroy 进程优先级前台/可见/服务/后台/空 二任务栈 三启动模式 standard singleTop 栈顶复用 singleTask 栈内复用 singeInstance 四scheme跳转协议 服务器可以定制化告诉App跳转哪个页面,可以通过通知栏消息定制化跳转页面,可以通过H5页面跳转页面 Fragment 一第五大组件 为什么是第五大组件 Fragment相对Activity更节省内存,切换更舒适Fragment加载到Activity的两种方式 静态加载xml 动态加载fragmentTransaction.add(id, fragment, “name”); .commit; FragmentPagerAdapter与FragmentStatePagerAdapter

FragmentStatePagerAdapter在切换时回收内存,适合页面较多的情况FragmentPagerAdapter并没有回收内存,只是detach了Activity 二生命周期 onAttach -> onCreate -> onCreateView -> onViewCreated -> onActivityCreated -> onStart -> onResume -> onPause -> onStop -> onDestroyView -> onDestroy -> onDetach 先创建Activity后创建Fragment,先销毁Fragment后销毁Activity 三Fragment之间的通信 Fragment调用Activity getActivity Activity调用Fragment 接口回调 Fragment调用Fragment方法findFragmentById 四FragmentManager replace add remove Service 一应用场景,与Thread区别 Service是什么后台长时间运行,没有用户界面,运行在主线程,不能有耗时操作 Service与Thread区别 Activity难以与Thread交互,尤其当Activity销毁以后 二开启Service的两种方式 StartService onCreate -> onStartCommand -> onBind -> onDestroy onStartCommand return START_STICKY;

Android UI开发专题

https://www.doczj.com/doc/5b18645283.html,/cmdn/bbs/viewthread.php?tid=18736&page=1 #pid89255 Android UI开发专题(一) 之界面设计 近期很多网友对Android用户界面的设计表示很感兴趣,对于Android UI开发自绘控件和游戏制作而言掌握好绘图基础是必不可少的。本次专题分10节来讲述,有关OpenGL ES相关的可能将放到以后再透露。本次主要涉及以下四个包的相关内容:android.content.res 资源类 android.graphics 底层图形类 android.view 显示类 android.widget 控件类 一、android.content.res.Resources 对于Android平台的资源类android.content.res.Resources可能很多网友比较陌生,一起来看看SDK上是怎么介绍的吧,Contains classes for accessing application resources, such as raw asset files, colors, drawables, media or other other files in the package, plus important device configuration details (orientation, input types, etc.) that affect how the application may behave.平时用到的二进制源文件raw、颜色colors、图形drawables和多媒体文件media的相关资源均通过该类来管理。 int getColor(int id) 对应res/values/colors.xml Drawable getDrawable(int id) 对应res/drawable/ XmlResourceParser getLayout(int id) 对应res/layout/ String getString(int id) 和CharSequence getText(int id) 对应res/values/strings.xml InputStream openRawResource(int id) 对应res/raw/ void parseBundleExtra (String tagName, AttributeSet attrs, Bundle outBundle) 对应res/xml/ String[] getStringArray(int id) res/values/arrays.xml float getDimension(int id) res/values/dimens.xml 二、android.graphics.Bitmap 作为位图操作类,Bitmap提供了很多实用的方法,常用的我们总结如下: boolean compress(https://www.doczj.com/doc/5b18645283.html,pressFormat format, int quality, OutputStream stream) 压缩一个Bitmap对象根据相关的编码、画质保存到一个OutputStream中。其中第一个压缩格式目前有JPG和PNG void copyPixelsFromBuffer(Buffer src) 从一个Buffer缓冲区复制位图像素 void copyPixelsToBuffer(Buffer dst) 将当前位图像素内容复制到一个Buffer缓冲区 我们看到创建位图对象createBitmap包含了6种方法在目前的Android 2.1 SDK中,当然他们使用的是API Level均为1,所以说从Android 1.0 SDK开始就支持了,所以大家可以放心使用。

复习材料《Android移动应用开发技术》

1、关于android进程,说法不正确的是( B ) A、组件运行所在的进程,是由androidManifest.xml决定,它可以指定该组件运行于哪个进程。 B、背景进程是不为用户所见的Activity,但是还会有可能被用户看到,所以它不能被杀死 C、当急需内存时,android会决定优先关闭那些空闲的进程 D、可视进程一般不会不被系统所杀死 2、Matrix类的作用( A ) A、可以存储缩小或放大比列 B、存储文件中的图片信息 C、存储资源中的图片信息 D、存储内存中的图片信息 3、关于主题的说法,错误的是( D ) A、它是属性集合 B、它可以在程序中来设置 C、它通常用于一个Activity或所有Activity上 D、它可以用于单个TextView上 4、setOnTouchEvent 设置返回值为true 和 false有何区别?以下说法较准确是( C ) A、没有区别,都能对事件进行监听 B、设置为true时只能在移动时获得一次监听事件,false则可以多次 C、设置为false是,在处理一次监听事件后,系统将抛弃该次事件 D、返回true表示这个消息已经被处理结束,后续的handler不再接收到这个消息 二、开发技术设计与应用能力部分 注:以下程序均是相关程序或小项目的实现代码,根据每个程序或项目的特性,完成程序空缺部分的内容,使其实现。具体程序代码注释省略。 图1 图2 图3 图4 1)电话实现[主界面如图1] 程序描述:完成手机打电话功能。 public class MainActivity extends Activity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(https://www.doczj.com/doc/5b18645283.html,yout.activity_main); Button btn_call = (Button)this.findViewById(R.id.btn_call); btn_call.setOnClickListener(new btnCall()); } private class btnCall implements OnClickListener (1) { public void onClick(View v) { // TODO Auto-generated method stub EditText et_number = (EditText) MainActivity.this.findViewById(R.id.et_number); String s_number = et_number.getText().toString().trim(); (2) Intent i_call = new Intent(); i_call.setAction(Intent.ACTION_CALL(3)); i_call.setData(Uri.parse("tel:"+s_number)); startActivity(i_call); (4) } } } 2)动画实现[主界面如图2] 程序描述:手机屏幕触摸后演示动画,假设XML文件已经设置好,id资源为:R.drawable.panda public class MainActivity extends Activity { ImageView iv_action; AnimationDrawable ad_action; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(https://www.doczj.com/doc/5b18645283.html,yout.activity_main); iv_action = (ImageView)this.findViewById(R.id.iv_action); iv_action.setBackgroundResource(5)(R.drawable.panda); ad_action = (AnimationDrawable) iv_action.getBackground(); } public boolean onTouchEvent(MotionEvent event) { ad_action.start();(6) return super.onTouchEvent(event); } } 3)撕衣服游戏实现 项目描述:划动屏幕时完成撕衣服效果,并产生撕衣服声音(sound.mp3) public class MainActivity extends Activity { ImageView iv_upper; ImageView iv_below;

android开发笔记

实现直接拒接来电 经过简单的google/baidu后,发现android没有现成的API去拒接电话。android可以通过注册BroadcastReceiver截取短信,因为这个broadcast是一个ordered broadcast,所以只要优先级比短信接收程序高,就可以提前终止掉这个broadcast receiver。 但是,电话呼入则没有类似的机制。不过,综合网上的一些资料,通过以下大体的步骤,则可以实现拒接电话: 1、注册broadcast receiver,监视手机状态: Java代码 1. 2. 3. 4. 5. 当手机接收到电话时,则会触发该broadcast receiver。 2、最重要的,就是取得可以控制电话的API。这些API貌似是android内部的接口,并未暴露。具体方式参见该帖子:https://www.doczj.com/doc/5b18645283.html,/u/20091226 ... d-586a278875c0.html 使用时需要手动添加import: Java代码 1.import com.android.internal.telephony.ITelephony; import com.android.internal.telephony.ITelephony; 同样的方式,在stackoverflow上也有人大致地提了下:https://www.doczj.com/doc/5b18645283.html,/questio ...

Android Canvas绘图详解

Android Canvas绘图详解(图文) 摘要Android中使用图形处理引擎,2D部分是android SDK内部自己提供,3D部分是用Open GL ES 1.0。今天我们主要要了解的是2D相关的,如果你想看3D的话那么可以跳过这篇文章。大部分2D 使用的api都在android.graphics和android.graphics.drawable包中。他们提供了图 Android中使用图形处理引擎,2D部分是android SDK内部自己提供,3D部分是用Open GL ES 1.0。今天我们主要要了解的是2D相关的,如果你想看3D的话那么可以跳过这篇文章。 大部分2D使用的api都在android.graphics和android.graphics.drawable包中。他们提供了图形处理相关的:Canvas、ColorFilter、Point(点)和RetcF(矩形)等,还有一些动画相关的:AnimationDrawable、BitmapDrawable和TransitionDrawable等。以图形处理来说,我们最常用到的就是在一个View上画一些图片、形状或者自定义的文本内容,这里我们都是使用Canvas来实现的。你可以获取View中的Canvas对象,绘制一些自定义形状,然后调用View. invalidate方法让View重新刷新,然后绘制一个新的形状,这样达到2D动画效果。下面我们就主要来了解下Canvas的使用方法。 Canvas对象的获取方式有两种:一种我们通过重写View.onDraw方法,View中的Canvas 对象会被当做参数传递过来,我们操作这个Canvas,效果会直接反应在View中。另一种就是当你想创建一个Canvas对象时使用的方法: 1 2 Bitmap b = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888); Canvas c =new Canvas(b); 上面代码创建了一个尺寸是100*100的Bitmap,使用它作为Canvas操作的对象,这时候的Canvas就是使用创建的方式。当你使用创建的Canvas在bitmap上执行绘制方法后,你还可以将绘制的结果提交给另外一个Canvas,这样就可以达到两个Canvas协作完成的效果,简化逻辑。但是android SDK建议使用View.onDraw参数里提供的Canvas就好,没必要自己创建一个新的Canvas对象。接下来我们看看Canvas提供我们哪些绘制图形的方法。我们创建一个自定义View对象,使用onDraw方法提供的Canvas进行绘制图形。 CanvasDemoActivity.java: 1 2 3 4 5 6 package com.android777.demo.uicontroller.graphics; import android.app.Activity; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color;

ANDROID实训心得体会

项目总结 时间过的好快,为期三个月的实训生活即将结束了,每一次的实训我们都受益匪浅,我 们学到的不仅仅是课内还有课外,实训让我们的课内知识得到了巩固,专业知识、编程水平 都有很大的提高,我们非常感谢这次实训。 刚开始二周的高强度的课程安排让我们受益匪浅;接下来的项目实训又让我们可以巩固 了课程。这让我觉得实习生活充实而有意义。 乐淘购物项目和android优化大师,我更好的学习了ui的设计,如何使界面漂亮,美观, 巩固了listview,gridview,的使用,学会了动画进入界面的,和会移动的画廊等等。在这 两个项目中,除了让我明白工作中需要能力,素质,知识之外,更重要的是学会了如何去完 成一个任务,懂得了享受工作。当遇到问题,冷静,想办法一点一点的排除障碍,到最后获 取成功,一种自信心由然而生,这就是工作的乐趣。有时候也需要虚心请教,从别人的身上 真得能学习到不自己没有的东西,每一次的挫折只能使我更接近成功。 音乐播放器项目,我们是七个人组成小组完成的,由组长带领我们,分配任务,每个人, 都发挥自己的长处,更好地去完成任务。对于团队开发来说,团结一致使我深有体会。团队 的合作注重沟通和信任,不能不屑于做小事,永远都要保持亲和诚信,把专业理论运用到具 体实践中,不仅加深我对理论的掌握和 运用,还让我拥有了一次又一次难忘的开发经历,这是也是实训最大的收获。 这次实训对于我以后学习、找工作也真是受益菲浅,在这3个月中让我初步从理性回到 感性的重新认识,也让我初步的认识这个社会,对于以后做人所应把握的方向也有所启发! 相信这些宝贵的经验会成为我今后成功的重要的基石。在此,我非常感谢指导老师和 同学对我的帮助。篇二:android实训报告 通信与电子信息专业实训报告 项目名称:基于android的游戏开发 班级 10通信1班 姓名 学号 指导教师 成绩 实训时间:年月日— 目录 一、实训目的及其意义 (3) 1.1、目的及意义 (3) 1.2、研究现状 (3) 二、实训主要任务、重点及难点 (4) 2.1、任务 (4) 2.2、重点内容及实现途径 (4) 三、实训具体内容及完成的主要工作 (5) 3.1、认识基础开发 (6) 3.2、了解数据存储 (6) 3.3、总体实训过程 (7) 四、实际遇到的困难,解决问题的方法和措施 (8) (一)、所遇问题 (8) (二)、解决方法与措施 (9) 五、心得体会 (9)

android手机测试总结(笔记)

2012年3月21日 系统测试(非功能性测试) 1、适配性测试 a) 手机的型号 b) 网络通信情况(2G\3G\WIFI\飞行模式、NET\WAP、中国电信、移动、联通) c) Android的版本号(Android 4.0、Android 2.3、Android 2.2、Android 2.1)主要是2.2\2. 3.*\ 4.0 d) 屏幕的分辨率(1280×720、960×640、960×540、854×480、800×480、640×480、640×360、480×360、480×320、400×240、320×240、220×176、) 2、功能模块测试(功能性测试) a) 根据预先编写的测试用例测试 3、异常测试(手机交互性事件) a) *按键打断,如:电源键、home键、音量键、返回键等;插拔数据线 b) 其他程序后台相互切换

c) *网络切换(2G\3G\WIFI\飞行模式、NET\WAP、中国电信、移动、联通、) d) 待机后是否能恢复程序和网络 e) 短信、电话和闹铃 f) 安装、覆盖安装和卸载 g) 有无SIM卡、有无SD卡 4、编写帮助文档或使用说明 2012-6-28 用户体验测试 1、界面 ①文字错误、图片不显示或显示不正确、缺少输入项、按钮的大小和点击效果 ②布局、图片和配色设计问题,测试人员很难进入 ③提示信息,提示信息语言准确简洁,有指导性。在应该提示的位置放入提示信息,比如程序需要接入网络,在无网络的情况下应给予提示 ④提示信息,提示信息的方式有很多,大概有弹出式和非弹出式两种,根据实际情况来区分

⑤阅读性,手机因输入方式和屏幕大小限时,目前以阅读为主要(除聊天软件),做好阅读是关键。文字字体、大小、颜色和背景颜色可调整,夜间模式 ⑥简洁,看看any.do就知道什么是简洁了,如穿着白纱美女的油画一般 ⑦输入法,输入法不能挡住输入框;回车可以跳转到下一个输入框 2、稳定性 ①网络,需要访问网络的程序,在网络不稳定的情况下,应能正常运行,不应出现意外退出和错误;如程序无法在该环境下运行,应提示用户 ②网络切换,同上 ③网络信号弱,同上 ④进程切换,在多进程切换中,应正常运行,并保持切换前页面,不应出现意外退出和错误 3、性能 ①程序进行某些功能时,不应使手机出现卡、顿等情况,视实际情况而定 4、安装 ①路径,可选择手机、SD卡

android UI界面设计

Android UI开发专题(一) 之界面设计 发帖日期:2010-02-09 10:49:28 标签:ophone 近期很多网友对Android用户界面的设计表示很感兴趣,对于Android UI开发自绘控件和游戏制作而言掌握好绘图基础是必不可少的。本次专题分10节来讲述,有关OpenGL ES相关的可能将放到以后再透露。本次主要涉及以下四个包的相关内容: android.content.res 资源类 android.graphics 底层图形类 android.view 显示类 android.widget 控件类 一、android.content.res.Resources 对于Android平台的资源类android.content.res.Resources可能很多网友比较陌生,一起来看看SDK上是怎么介绍的吧,Contains classes for accessing application resources, such as raw asset files, colors, drawables, media or other other files in the package, plus important device configuration details (orientation, input types, etc.) that affect how the application may behave.平时用到的二进制源文件raw、颜色colors、图形drawables和多媒体文件media的相关资源均通过该类来管理。 int getColor(int id) 对应res/values/colors.xml Drawable getDrawable(int id) 对应res/drawable/ XmlResourceParser getLayout(int id) 对应res/layout/ String getString(int id) 和CharSequence getText(int id) 对应 res/values/strings.xml InputStream openRawResource(int id) 对应res/raw/ void parseBundleExtra (String tagName, AttributeSet attrs, Bundle outBundle) 对应res/xml/ String[] getStringArray(int id) res/values/arrays.xml float getDimension(int id) res/values/dimens.xml 二、android.graphics.Bitmap 作为位图操作类,Bitmap提供了很多实用的方法,常用的我们总结如下: boolean compress(https://www.doczj.com/doc/5b18645283.html,pressFormat format, int quality, OutputStream stream) 压缩一个Bitmap对象根据相关的编码、画质保存到一个OutputStream中。其中第一个压缩格式目前有JPG和PNG void copyPixelsFromBuffer(Buffer src) 从一个Buffer缓冲区复制位图像素

Android期末复习题总结

1、Intent的Component属性的作用是什么,如何定义此属性? component(组件),指定Intent的的目标组件的类名称。通常Android会根据Intent 中 包含的其它属性的信息,比如action、data/type、category进行查找,最终找到一个与之匹 配的目标组件。但是,如果component这个属性有指定的话,将直接使用它指定的组件, 而不再执行上述查找过程。指定了这个属性以后,Intent的其它所有属性都是可选的。Component属性的作用是用来指定Intent的目标组件的类名称。如果Component这个属性被指定了的话,Intent的其它属性都是可选项,Android 会直接使用Component指定目标组件,而不再执行其它查找过程。 在使用时,需要先创建一个ComponentName对象,然后将它设置成Intent对 象的Component的属性。通过setComponent()、setClass()和setClassName() 三种方法都可以设置组件的名称,通过getComponent()方法则可获得设置项。 2、发送广播时,可以通过sendCatagoryBroadcast()方法将Intent对象发送出去( ). (错) 3、Android是什么?( ) 一种操作系统 4、下面关于Android dvm的进程和Linux的进程,应用程序的进程说法正确的是( ) DVM指dalivk的虚拟机。每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。而每一个DVM都是在Linux 中的一个进程,所以说可以认为是同一个概念。 5、Android操作系统最早由哪个公司研发?( ) Android公司 6、下列中不属于手持设备的是( ) 机顶盒 7、下列不是手机操作系统的是()。Windows Vista 8、到目前为止,Android操作系统的最高版本是哪个?( )Android L 9、安装Android SDK时,可以通过( )在线安装或离线安装。Android sdk manager 10、开发Android应用程序时,一般使用的计算机语言是( ) 。JAVA 11、E/AndroidRuntime(1099): https://www.doczj.com/doc/5b18645283.html,ng.RuntimeException: Unable to instantiate activity ComponentInfo{com.test/com.test.CanvasActivitys}: https://www.doczj.com/doc/5b18645283.html,ng.ClassNotFoundException: com.test.CanvasActivitys in loader dalvik.system.PathClassLoader[/data/app/com.test-1.apk] 这段话是程序报错在LogCat中产生的记录,从中可以分析问题的原因可能在哪里?( ) CanvasActivitys类没有在AndroidManifest中正确申明 12、对于直接Intent,Android不需要去做解析,因为目标组件已经很明确,Android 需要解析的是那些间接Intent,通过解析,将Intent映射给可以处理此Intent的Activity、IntentReceiver或Service (对) Intent 可以传递View对象(错) Intent起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被 调用者之间的解耦(对) 通过Intent可以删除程序(对) 13、下面退出Activity错误的方法是()。System.exit( ) 14、当启动一个Activity并且新的Activity执行完后需要返回到启动它的Activity来执行 的回调函数是( )。startActivityResult() 15、这是一个资源配置文件,下面描述正确的是? ( )这个shape文件是画一条虚线,实 线段5dp,间隔3dp 16、Toast toast = new Toast(this); toast.setText("今天天气不错\n哈哈"); toast.show(); 上面代码的执行结果是什么( )。代码会抛出异常,因为new出的Toast对象不能再使用setText方法来设置提示框文本

安卓开发学习笔记

1.avd:android virtual device 2.5554:模拟器端口号 3.ddms 观察线程thread 堆栈heap 、file explorer、emulator control(模拟打电话发短信) 4.Extras文件夹拓展工具 5.Adb.exe: android debug bridge 安卓调试桥 6.Adb常用指令:(配置环境变量) 1)adb devices:列出所有连接设备 2)Reset adb:重启adb调试桥 3)Adb kill-server:杀死adb调试桥 4)Adb start-server:启动adb调试桥 5)Netstat -ano:查看端口号 ----------------------------------------------------------------------------------------- 7.Platforms是系统文件 8.Assets是资产目录存放在该文件夹下面这些文件会被打包到应用程序的apk 9.Bin 编译后的文件目录 10.Gen自动生成的其下的R.java的内容也是通过修改其他文件内容而自动生成 11.Android.jar基于此jar包的开发 12.Project.properties 代表编译的版本可以修改 13.Libs 支持jar 包会被添加到Android dependence(依赖)目

录下 14.Res 资源目录 15.Drawable存放应用程序图标会自动生成一个id 在R文件里 1)H high 高分辨率 2)M middle 中分辨率 3)L low 低分辨率 4)X extra large 特大分辨率 5)Xx 超大分辨率 16. R文件的作用:自动编译生成res文件中的ID 17.Android manifest:应用程序的清单文件 程序的配置信息启动的图标应用程序名称包名版本号 -------------------------------------------------------------------------------------- 18.Android下软件安装的过程: 1)拷贝xxx.apk到/data/app/xxx-1.apk 2)在data/data目录下创建一个文件夹文件夹名称是当前应 用程序的包名。 3)软件卸载的过程是相反的 19.system/app下安装的是系统自带的应用 20.Windows下注册表是通过数据库实现;Android下的注册表是用xml文件实现

Android 图形系统分析-surfaceFlinger流程

第一章Android GDI之基本原理及其总体 框架 Android GDI基本框架 在Android中所涉及的概念和代码最多,最繁杂的就是GDI相关的代码了。但是本质从抽象上来讲,这么多的代码和框架就干了一件事情:对显示缓冲区的操作和管理。 GDI主要管理图形图像的输出,从整体方向上来看,GDI可以被认为是一个物理屏幕使用的管理器。因为在实际的产品中,我们需要在物理屏幕上输出不同的窗口,而每个窗口认为自己独占屏幕的使用,对所有窗口输出,应用程序不会关心物理屏幕是否被别的窗口占用,而只是关心自己在本窗口的输出,至于输出是否能在屏幕上看见,则需要GDI来管理。 从最上层到最底层的数据流的分析可以看到实际上GDI在上层为GUI提供一个抽象的概念,就好像操作系统中的文件系统所提供文件,目录等抽象概念一样,GDI输出抽象成了文本,画笔,位图操作等设备无关的操作,让应用程序员只需要面对逻辑的设备上下文进行输出操作,而不要涉及到具体输出设备,以及输出边界的管理。GDI负责将文本、线条、位图等概念对象映射到具体的物理设备,所以GDI的在大体方向上可以分为以下几大要素:画布 字体 文本输出 绘画对象 位图输出 Android的GDI系统 Android的GDI系统所涉及到概念太多,加之使用了OpenGL使得Android的层次和代

码很繁杂。但是我们对于Android的GDI系统需要了解的方面不是他的静态的代码关系,而是动态的对象关系,在逻辑运行的架构上理解GDI。我们首先还是需要从代码结构开始我们的理解。 Frameworks/Libs/Surfaceflinger Frameworks/base/core/jni/android_view_Surface.cpp Frameworks/base/core/java/android/view/surface.java Frameworks/base/Graphics:绘图接口 Frameworks/Libs/Ui External/Skia 其中External/Skia是一个C++的2D图形引擎库,Android的2D绘制系统都是建立在该基础之上.Skia完成了:文本输出,位图,点,线,图像解码等功能。在这里给出Android GDI 的基本框架示意图。 对于上面的GDI架构图我们只是一个大概的了解,我们有太多的问题需要解决,有太多的疑问需要得到答案,我就一直在想,为什么设计者有提出如此众多的概念,这个概念的背景是什么?他要管理什么,他要抽象什么?从前面知道,Android的整个设计理念就是无边界化,他是如何穿透Linux进程这个鸿沟来达到无边界的?Surface,Canvas,Layer,LayerBase, NativeBuffer,SurfaceFlinger,SurfaceFlingerClient这些到底是一个什么东西?如

Android实习报告

合肥工业大学学生自主实习报告 学号: xxx 姓名: xxx 实习单位: 实习时间:2014年6月22-7月5日

一、实习目的: 1、掌握android系统开发的一些常用知识 2、拥有独立解决开发中遇到问题的能力 3、熟悉android软件开发流程并至少做一个android软件项目。 了解现阶段互联网发展主流,了解移动互联网,认识移动互

联网的发展与展望,认识Android,了解基于Android的应用软件开发方法及其商业流程。把理论与实际结合,通过对理论知识的理解,领悟从而运用到生活实际巩固所学的知识,提高对实际生活的认识,积累经验。使学生在此期间能够初次体会到实际生产中的种种技能与经验,完成一项项目锻炼独立思考及团队合作能力。使学生们进一步加深对所学知识的理解,理论联系实际,巩固所学有关计算机基础理论知识和基本技能,学习有关计算机最新技术方面的应用,增强学生对计算机在社会生活,社会生产中应用的感性认识,深入了解计算机在各个领域中的应用状况。生产实习是学校教学的重要补充部分,是区别于普通学校教育的一个显著特征,是教育教学体系中的一个不可缺少的重要组成部分和不可替代的重要环节。它是与今后的职业生活最直接联系的,学生在生产实习过程中将完成学习到就业的过渡,因此生产实习是培养技能型人才,实现培养目标的主要途径。它不仅是校内教学的延续,而且是校内教学的总结。生产实习一方面巩固了书本上学到的理论知识,另一方面,可获得在书本上不易了解和不易学到的生产现场的实际知识,使我们在实践中得到提高实训环节对于提高学生的综合能力和全面素质具重要意义 二、实习单位:苏州高博培训

android开发需要掌握的知识点

Android应用程序开发是以Java语言为基础的,所以需要有扎实的Java基础知识。首先熟悉java基本语法,然后熟悉设计模式等。 a) Java基础语法:看下面的《Java知识点列表》 b)设计模式:由于在Android系统的框架层当中,使用了大量的设计模式,如果没有这个方面的知识,对于Android的理解就会大打折扣。设计模式的种类非常之多(设计模式大概有28种,具体请看设计模式系列),一个一个的全部掌握,是不现实的,必须首先掌握面向对象的基础设计原则,有了这些基础原则的支持,理解android容易很多。 有了这些知识,然后再来学习Android开发,一定会事半功倍。 《Java知识点列表》:这些是别人总结,我只是加些说明。 开发环境: 1 Java SDK 下载和安装 2 环境变量的配置(path和classpath) 编程基础: 3. 标识符命名规范 4 Java数据类型 5 运算符 6 分支语句(if,switch) 7 循环语句(for,while) 8 函数的定义方法 只要是个程序员,都懂。语言之间可以融会贯通。 面向对象基础: 向对象的三个基本特征是:封装、继承、多态 9. 面向对象与面向过程语言之间的区别 10 面向对象基本思想(封装) 封装:把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏 11 类的定义方法 12 对象和类的关系 13 对象的创建方法 14 通过对象使用成员变量和成员函数的方法 15 构造函数的作用 16 函数的重载 17 static 的作用 18 this的作用 面向对象高级: 19 面向对象基本思想(继承) 继承:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进

相关主题
文本预览
相关文档 最新文档