收藏 分享(赏)

Android图形图像.ppt

上传人:Facebook 文档编号:9722007 上传时间:2019-08-28 格式:PPT 页数:118 大小:1.66MB
下载 相关 举报
Android图形图像.ppt_第1页
第1页 / 共118页
Android图形图像.ppt_第2页
第2页 / 共118页
Android图形图像.ppt_第3页
第3页 / 共118页
Android图形图像.ppt_第4页
第4页 / 共118页
Android图形图像.ppt_第5页
第5页 / 共118页
点击查看更多>>
资源描述

1、第11章 Android图形图像,1、Android访问图片 2、Android动画 3、Android动态图像绘制 4、Android图形特效 5、Android与OpenGL ES,Android处理图形的能力非常强大,对于2D图形的处理不使用Java API处理,Android系统定义了一系列处理2D图形的处理类,这些类分别位于android.graphics、android.graphics.drawbable.shapes和android.view.animation包中。对于3D图形的处理Android使用OPenGL ES,这些类位于javax.microedition.khro

2、nos.opengles和android.opengl包中。Android系统中图形大体上分两类,一是静态图形的处理,也就是不经常变化的图片,如icon、logo、动画等。对于这种类型的图片通过各种Drawable类来处理,这种方式一般是将图片放在res/drawable目录或者res/animation目录中。对于动态图片(大小、位置格式经常变化的图片),一般采用不断的重新绘制绘制的方式来处理,例如游戏中场景、角色和道具等。,Android使用访问图片,创建Drawable对象,Android在访问图片时,使用Drawable类及其子类BitmapDrawable、ColorDrawable

3、、ShapeDrawable等类处理,关于Drawable类的初始化有三种方式,一是使用在工程中保存的图片;二是使用mxl定义Drawable属性;三是使用构造器来完成,但这种方法不经常被采纳。,使用图片创建Drawable对象,在资源文件中保存一图片文件test.jpg,然后通过R.drawable.test使用该图片,代码如下: ImageView imgv = (ImageView)findViewById(R.id.imgv); imgv.setImageResource(R.drawable.test); 也可以使用xml文件定义Drawable对象 例如:在AndroidManif

4、est.xml文件中定义应用的图标: ,Bitmap和BitmapFactory,如果图片是保存在SD卡中,就需要Bitmap和BitmapFactory两个类来读取SD卡中的文件 例如: public class MainActivity extends Activity /* Called when the activity is first created. */Overridepublic void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);/ setContentView(R.layo

5、ut.main);String path = “/sdcard/bg.png“;Bitmap bm = BitmapFactory.decodeFile(path);ImageView iv = new ImageView(this);iv.setImageBitmap(bm);this.setContentView(iv); ,Album实例,这是一个通过调用系统相机实现拍照功能,拍照之后直接进入照片浏览,可以继续拍照也可以退出的小应用。如下图所示:,public class MainActivity extends Activity /* Called when the activity

6、is first created. */ private String logTag = “Exception“;Overridepublic void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);setContentView(R.layout.main);try Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);startActivityForResult(intent, 0); catch (Exception e) Log

7、.v(logTag, e.getMessage(); ,protected void onActivityResult(int requestCode, int resultCode, Intent data)try if (requestCode != 0) return;super.onActivityResult(requestCode, resultCode, data); Bundle extras = data.getExtras(); Bitmap b = (Bitmap) extras.get(“data“); Intent intent = new Intent();inte

8、nt.setClass(this, ShowImageActivity.class);intent.putExtra(“image“,b);this.startActivity(intent); catch (Exception e) / TODO: handle exceptionLog.v(logTag, e.getMessage(); ,public static final String MIME_TYPE_IMAGE_JPEG = “image/jpeg“; public static final int ACTIVITY_GET_IMAGE = 0; public static f

9、inal String FILE_NAME = “name“; public static final String FILE_TYPE = “type“; public static final String FILE_BITS = “bits“; public static final String FILE_OVERWRITE = “overwrite“; public static final String FILE_URL = “url“; private byte mContent; Override public void onCreate(Bundle savedInstanc

10、eState) super.onCreate(savedInstanceState); setContentView(R.layout.showimage); Intent getImage = new Intent(Intent.ACTION_GET_CONTENT); getImage.addCategory(Intent.CATEGORY_OPENABLE); getImage.setType(MIME_TYPE_IMAGE_JPEG); startActivityForResult(getImage, ACTIVITY_GET_IMAGE); ,Override protected v

11、oid onActivityResult(int requestCode, int resultCode, Intent data) if (resultCode != RESULT_OK) return; Bitmap bm = null; ContentResolver resolver = getContentResolver(); if (requestCode = ACTIVITY_GET_IMAGE) try Uri originalUri = data.getData(); /获得图片的uri mContent = getBytesFromInputStream(resolver

12、.openInputStream(Uri .parse(originalUri.toString(), 3500000); bm = getPicFromBytes(mContent, null); ImageView iv = getThemedImageView(); /显示图片 iv.setImageBitmap(bm); setContentView(iv); catch (IOException e) System.out.println(e.getMessage(); ,public static byte getBytesFromInputStream(InputStream i

13、s, int bufsiz) throws IOException int total = 0; byte bytes = new byte4096; ByteBuffer bb = ByteBuffer.allocate(bufsiz); while (true) int read = is.read(bytes); if (read = -1) break; bb.put(bytes, 0, read); total += read; byte content = new bytetotal; bb.flip(); bb.get(content, 0, total); return con

14、tent; ,private ImageView getThemedImageView() ImageView iv = new ImageView(this); iv.setBackgroundResource(android.R.drawable.gallery_thumb); return iv; Override public boolean onCreateOptionsMenu(Menu menu) / TODO Auto-generated method stub menu.add(0, 0, 0, “继续拍照“); return true; Override public bo

15、olean onOptionsItemSelected(MenuItem item) / TODO Auto-generated method stub Intent intent = new Intent(this,MainActivity.class); startActivity(intent); return true; ,public static Bitmap getPicFromBytes(byte bytes, BitmapFactory.Options opts) if (bytes != null) if (opts != null) return BitmapFactor

16、y.decodeByteArray(bytes, 0, bytes.length, opts); else return BitmapFactory.decodeByteArray(bytes, 0, bytes.length); return null; ,Android中的动画,Tween动画,Tween动画可以使视图组件移动、放大、缩小,以及产生透明的变化。例如在一个ImageView组件中,通过Tween动画可以使该视图实现放大、缩小、旋转、渐变等效果。Tween动画相关的类在android.view.animation包中,如: (1) Animation:抽象类,其他几个动画类继承

17、自该类 (2) ScaleAnimation类:控制尺寸变化的动画类 (3) AlphaAnimation:控制透明变化的动画类 (4) RotateAnimation:控制旋转变化的动画类 (5) TranslateAnimation:控制移动变化的动画类 (6) AnimationSet:定义动画属性集合类 (7) AnimationUtils:动画的工具类 总之,Tween动画一共有4种形式,具体如下:,1、Alpha(渐变动画) 实现类:AlphaAnimation 常用构造器:AlphaAnimation(float fromAlpha,float,toAlpha) 常用构造器参数说

18、明:fromAlpha:动画开始的透明度,toAlpha:动画结束前的透明度(取值范围是0.01.0),2、Scale(尺寸变化动画) 实现类:ScaleAnimation 常用构造器:ScaleAnimation(float fromX,float toX,float fromY,float toY,int pivotXtype,float pivotXValue,int pivotYType,float pivotYValue) 常用构造器参数说明: fromX:起始X坐标上的伸缩尺寸 toX:结束X坐标上的伸缩尺寸 fromY:起始Y坐标上的伸缩尺寸 toY:结束Y坐标上的伸缩尺寸 pi

19、votXType:在X轴上的伸缩模式,(取值有:Animation.ABSOLUTE、Animation.RELATIVE_TO_SELF、Animation.RELATIVE_TO_PARENT) pivotXValue:相对于X坐标的伸缩值 pivotYType:在Y轴上的伸缩模式,(取值有:Animation.ABSOLUTE、Animation.RELATIVE_TO_SELF、Animation.RELATIVE_TO_PARENT) pivotYValue:相对于Y坐标的伸缩值,3、Translate(位置变化动画): 实现类:TranslateAnimation 常用构造器:Tr

20、anslateAnimation(float fromXData,float toXAata,float fromYData,float toYData) 常用构造器参数说明: fromXData:起始X坐标 toXData:结束X坐标 fromYData:起始Y坐标 toYData:结束Y坐标 4、Rotate(旋转变化动画): 实现类:RotateAnimation 常用构造器:RotateAnimation(float fromDegrees,float toDegrees,int pivotXtype,float pivotXValue,int pivotYType,float piv

21、otYValue) 常用构造器参数说明: fromDegrees:起始旋转角度;toDegrees:结束旋转角度 pivotXType:在X轴上的伸缩模式,(取值有:Animation.ABSOLUTE、Animation.RELATIVE_TO_SELF、Animation.RELATIVE_TO_PARENT) pivotXValue:相对于X坐标的伸缩值 pivotYType:在Y轴上的伸缩模式,(取值有:Animation.ABSOLUTE、Animation.RELATIVE_TO_SELF、Animation.RELATIVE_TO_PARENT) pivotYValue:相对于Y

22、坐标的伸缩值,缩放效果截图,渐变效果截图,移动效果截图,旋转效果截图,public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);setContentView(R.layout.main);yixiu = (ImageView)findViewById(R.id.yixiu);yixiu.setVisibility(View.INVISIBLE);bs = (Button)findViewById(R.id.bs);ba = (Button)findViewById(R.id.ba);bt

23、 = (Button)findViewById(R.id.bt);br = (Button)findViewById(R.id.br);bs.setOnClickListener(this);ba.setOnClickListener(this);bt.setOnClickListener(this);br.setOnClickListener(this); ,Override public void onClick(View arg0) / TODO Auto-generated method stub Animation animation = null; int id = arg0.ge

24、tId();,switch(id) case R.id.bs:yixiu.setVisibility(View.VISIBLE); animation = new ScaleAnimation(0f,1f,0f,1f,Animation.RELATIVE_TO_SELF,2f,Animation.RELATIVE_TO_SELF,2f); animation.setDuration(3000); yixiu.setAnimation(animation); break; case R.id.ba: yixiu.setVisibility(View.VISIBLE); animation = n

25、ew AlphaAnimation(0.1f,1.0f); animation.setDuration(3000); yixiu.setAnimation(animation); break;,case R.id.bt: yixiu.setVisibility(View.VISIBLE); animation = new TranslateAnimation(10,10,10,100); animation.setDuration(3000); yixiu.setAnimation(animation); break; case R.id.br: yixiu.setVisibility(Vie

26、w.VISIBLE); animation = new RotateAnimation(0f,-1880f,Animation.RELATIVE_TO_SELF,0.8f,Animation.RELATIVE_TO_SELF,0.8f); animation.setDuration(8000); yixiu.setAnimation(animation); break; ,除了通过以上“硬编码”实现Tween动画的4种效果外,还可以使用“软编码”即使用xml配置文件的方式来实现,这个xml文件在rs/anim目录中,这种方式是Android推荐使用的方式。 首先定义各种动画xml文件 1、my

27、scale.xml,2、myalpha.xml3、myrotate.xml,4、mytrans.xml然后修改MainActivity.java中的代码:,case R.id.bs: yixiu.setVisibility(View.VISIBLE); Animation sAnimation = AnimationUtils.loadAnimation(MainActivity.this, R.anim.myscale); yixiu.startAnimation(sAnimation); break;,case R.id.ba: yixiu.setVisibility(View.VISIB

28、LE); Animation aAnimation = AnimationUtils.loadAnimation(MainActivity.this, R.anim.myalpha); yixiu.startAnimation(aAnimation); break; case R.id.bt: yixiu.setVisibility(View.VISIBLE); Animation tAnimation = AnimationUtils.loadAnimation(MainActivity.this, R.anim.mytrans); yixiu.startAnimation(tAnimati

29、on); break; case R.id.br: yixiu.setVisibility(View.VISIBLE); Animation rAnimation = AnimationUtils.loadAnimation(MainActivity.this, R.anim.myroate); yixiu.startAnimation(rAnimation); break;,运行结果同上例完全一致。,Frame动画,Frame动画是顺序播放图片来产生的一种动画效果类似于电影。例如要实现一个人走路的动画效果,可以通过3张图片实现:第一张是两脚着地;第二张是左脚着地;第三张是右脚着地。这样顺序播

30、放就形成了人走路的动画了。Frame动画是通过AnimationDrawable类实现的。该类中有两个重要的方法是start()和stop(),分别用来开始和停止动画。动画一般是通过xml配置文件来进行配置的。在res/anim目录中定义xml文件,该文件的根元素是,子元素是,子元素可以有多个。 frame_anim.xml文件内容如下:,Frame动画截图,代码如下:,public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);setContentView(R.layout.main);

31、imageView = (ImageView)findViewById(R.id.iamgeView);ad = (AnimationDrawable)imageView.getBackground(); Overridepublic boolean onCreateOptionsMenu(Menu menu) menu.add(0,0,0,“开始“); menu.add(0,1,1,“停止“); return true;,Overridepublic boolean onOptionsItemSelected(MenuItem item) switch(item.getItemId() ca

32、se 0: Animation animation = new TranslateAnimation(10,100,10,10); animation.setDuration(6000); ad.start(); imageView.startAnimation(animation); break; case 1: ad.stop(); break; return true;,动态图形绘制,动态图形绘制的基本思路是,创建一个View类或者SurfaceView类,重写onDraw()方法,使用Canvas对象在界面上绘制不同图形,使用invalidate()方法刷新界面。动态绘制图形的常见类有

33、Canvas、Paint、Color、Path等。 1、Canvas类:Canvas类是画布,提供了各种图形的绘制方法,如矩形、圆、椭圆、点、线、文字等。具体方法见下表,2、Paint类:Paint类是画笔,用来描述图形的颜色和风格,如线宽、颜色、字体等信息。Paint类常用方法如下:,3、Color类:Color类中定义了一些颜色常量和创建颜色的方法,颜色定义使用RGB定义,如下表:,4、Path类:一般用来从某个点移动到另一个点连线,例如画梯形需要有点和连线,常使用的方法如下:,5、Shader类及其子类: 用来渲染图像使用的类,子类有BitmapShader、ComposeShader、

34、 LinearGradient、RadialGradient、SweepGradient。 各个类的用法参照SDK doc。,实例1:飞舞的小球,在这个例子中,通过自定义View,并继承View类, 通过多线程机制不断的绘制并刷新,实现小球飞舞的情景。如图所示,代码如下:,class MyView extends View implements Runnable / 图形当前坐标 private int x = 20, y = 20; /坐标控制开关 boolean flagy = true; boolean flagx = true; / 构造方法 public MyView(Context

35、 context, AttributeSet attrs) super(context, attrs); / 获得焦点 setFocusable(true); / 启动线程 new Thread(this).start(); ,public void run() while(!Thread.currentThread().isInterrupted() MyView.this.update(); try Thread.sleep(10); catch (InterruptedException e) e.printStackTrace(); Override protected void on

36、Draw(Canvas canvas) super.onDraw(canvas); / 实例化画笔 Paint p = new Paint(); / 设置画笔颜色 p.setColor(Color.WHITE); / 画圆 canvas.drawCircle(x, y, 20, p); MyView.this.postInvalidate(); ,/ 更新坐标 private void update() int h = getHeight(); int w = getWidth(); if(x=w-20) flagx = false; if(y=h-20) flagy = false; if(

37、x=20) flagx = true; if(y=20) flagy=true; if(flagy) y+=5; if(!flagy) y-=5; if(flagx) x+=5; if(!flagx) x-=5; ,public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);MyView v = new MyView(this,null);setContentView(v);,实例2:Canvas、Paint、Shader类综合应用,public class MyView extends

38、View public MyView(Context context)super(context); Override protected void onDraw(Canvas canvas) / TODO Auto-generated method stub super.onDraw(canvas); /设置画布颜色 canvas.drawColor(Color.WHITE); Paint paint = new Paint(); /去除锯齿 paint.setAntiAlias(true); paint.setColor(Color.RED); /设置样式 paint.setStyle(P

39、aint.Style.STROKE); /设置画笔粗细 paint.setStrokeWidth(3);,/画圆 canvas.drawCircle(40, 40, 30, paint); /画矩形 canvas.drawRect(10, 90, 70, 150, paint); canvas.drawRect(10, 170, 70, 200, paint); /声明矩形区域 RectF re = new RectF(10,220,70,250); /画椭圆 canvas.drawOval(re, paint); /实例化Path Path path = new Path(); path.m

40、oveTo(10,330); path.lineTo(70, 330); path.lineTo(40, 270); path.close(); canvas.drawPath(path, paint);,Path path1 = new Path(); path1.moveTo(10,410); path1.lineTo(70, 410); path1.lineTo(55, 350); path1.lineTo(25, 350); path1.close(); canvas.drawPath(path1, paint); paint.setStyle(Paint.Style.FILL); p

41、aint.setColor(Color.BLUE); /画圆 canvas.drawCircle(120, 40, 30, paint); /画矩形 canvas.drawRect(90, 90, 150, 150, paint); canvas.drawRect(90, 170, 150, 200, paint); /声明矩形区域 RectF re2 = new RectF(90,220,150,250); /画椭圆 canvas.drawOval(re2, paint);,/实例化Path Path path2 = new Path(); path2.moveTo(90,330); pat

42、h2.lineTo(150, 330); path2.lineTo(120, 270); path2.close(); canvas.drawPath(path2, paint); Path path3 = new Path(); path3.moveTo(90,410); path3.lineTo(150, 410); path3.lineTo(135, 350); path3.lineTo(105, 350); path3.close(); canvas.drawPath(path3, paint);,Shader lShader1 = new LinearGradient(0, 0, 1

43、00, 100, new intColor.RED,Color.GREEN,Color.BLUE,Color.YELLOW, null, Shader.TileMode.REPEAT ); Shader lShader2 = new LinearGradient(0, 0, 100, 100,Color.RED,Color.GREEN, Shader.TileMode.MIRROR); Shader sShader1 = new SweepGradient(0, 0,new intColor.RED,Color.GREEN,Color.BLUE,Color.YELLOW, null); Sha

44、der sShader2 = new SweepGradient(0, 0,Color.RED,Color.GREEN ); paint.setShader(lShader1); /画圆 canvas.drawCircle(200, 40, 30, paint); /画矩形 canvas.drawRect(170, 90, 230, 150, paint); canvas.drawRect(170, 170, 230, 200, paint);/声明矩形区域 RectF re3 = new RectF(170,220,230,250); /画椭圆 canvas.drawOval(re3, pa

45、int);,/实例化Path Path path4 = new Path(); path4.moveTo(170,330); path4.lineTo(230, 330); path4.lineTo(200, 270); path4.close(); canvas.drawPath(path4, paint); Path path5 = new Path(); path5.moveTo(170,410); path5.lineTo(230, 410); path5.lineTo(215, 350); path5.lineTo(185, 350); path5.close(); canvas.d

46、rawPath(path5, paint);,paint.reset(); paint.setColor(Color.BLACK); paint.setTextSize(24); canvas.drawText(“圆形“, 240, 50, paint); canvas.drawText(“正方形“, 240, 120, paint); canvas.drawText(“长方形“, 240, 190, paint); canvas.drawText(“椭圆形“, 240, 250, paint); canvas.drawText(“三角形“, 240, 320, paint); canvas.

47、drawText(“梯形“, 240, 390, paint); ,public class MainActivity extends Activity /* Called when the activity is first created. */Overridepublic void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);setContentView(new MyView(this); ,图形特效,使用Matrix实现旋转平移和缩放,在Android系统中Matrix类是一个矩阵,该类中

48、有一个3*3的矩阵坐标,通过该类可以实现旋转、平移和缩放的综合应用。使用reset()方法初始化矩阵,使用setScale()设置缩放属性,setTranslate()设置平移属性,setRotate()设置旋转属性。,public class MyView extends View private Bitmap bitmap = null; private Matrix matrix = new Matrix(); private float angle = 0.0f; private int width ; private int height ; private float scale

49、= 1.0f; private boolean isScale = false; public MyView(Context context)super(context);,bitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.yixiu); width = bitmap.getWidth(); height = bitmap.getHeight(); this.setBackgroundColor(Color.WHITE); this.setFocusable(true); ,Override protected void onDraw(Canvas canvas) super.onDraw(canvas); matrix.reset(); if(!isScale)matrix.setRotate(angle); elsematrix.setScale(scale, scale); Bitmap bm = Bitmap.createBitmap(bitmap, 0, 0, width, height,matrix,true); canvas.drawBitmap(bm, matrix, null); ,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报