`
heweiding155
  • 浏览: 29140 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

android 画图片的几种方法

阅读更多

习惯了使用java里的graphics类来绘制图形及图片,编写android的对图形及图片的绘制使用起来一直不太顺手。

下面我来小结一下目前使用过的android中画图片的方法

一、使用控件的setImageResource方法

1.在main.xml文件中写一个ImageView(TestView也能行,感觉只要是继承自View类的话都可以实现,但是没有逐个 去检验)     或者ImageButton等控件如下:

<LineLayout xmlns:android="http://schemas.android.com/apk/res/android"	 android:orientation="vertical"
		 android:layout_width="fill_parent"
		 android:layout_height="fill_parent">
	<ImageView
		android:id="@+id/board"
		android:layout_width="wrap_content"
		android:layout_height="wrap_content"></ImageView>
	<ImageButton
		android:id="@+id/piece"
		android:layout_width="20px"
		android:layout_height="20px"></ImageButton>
	</LineLayout>
 

2.将图片文件 piece.jpg和board.jpg放在res.drawable 文件夹下(drawable-hdpi,drawable-mdpi, drawable-ldpi,分别表示高像素,中像素,低像素的图片),暂且放在drawable-hdpi下吧。

 

3.接着将src下的main.java修改如下

	public class main extends Activity {
	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		// 通过findViewById获得ImageView
		board = (ImageView) findViewById(R.id.board);
		// 为ImageView设置图片资源
		board.setImageResource(R.drawable.board);
		// 通过findViewById获得ImageButton
		piece = (ImageButton) findViewById(R.id.piece);
		// 为ImageButton设置图片资源
		piece.setImageResource(R.drawable.piece);
	}

	// 图片视图ImageView
	private ImageView board;
	private ImageButton piece;

}

  4.运行android application 结果如附件中imagtest1.jpg所示。

二、使用View类的onDraw(Canvas canvas)方法和invalidate()实现在棋盘上画棋子

个人感觉如同如java中Panel的paint方法在Panel第一次显示的时候调用绘制Panel,repaint则是提供给程序员手动调用paint方法。

android中View类的onDraw方法,也是在View第一次显示的时候调用绘制View,invalidate()也是提供给程序员手动调用onDraw方法。

具体实现方法如下:(本例承接上个一例子,修改了部分代码)

1.新建一个ImageViewSelf.java 继承自ImageView

public class ImageViewSelf extends ImageView {
	//实例化一个paint对象,其可以设置canvas绘制图形的颜色等属性
	Paint paint = new Paint();
	//获得piece.jpg图片的资源,创建Bitmap对象
	private Bitmap  bitmap;
	
	//以下三个构造方法本人暂时不懂啥意思
	public ImageViewSelf(Context context) {
		super(context);
	}

	public ImageViewSelf(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
	}

	public ImageViewSelf(Context context, AttributeSet attrs) {
		super(context, attrs);
	}

	//设置bitmap的图片资源
	public void initImage(){
		bitmap = Bitmap.createBitmap(BitmapFactory.decodeResource(getResources(),R.drawable.piece));
	}
	
	//重写onDraw方法
	public void onDraw(Canvas canvas) 
		{
			//执行父类的onDraw方法
			super.onDraw(canvas);
			if(bitmap!=null){
				//在150,150坐标处画图bitmap图形
				canvas.drawBitmap(bitmap, 150, 150, paint);
			}
			 
	    }
	
	


}

  2.修改main中的ImageView为ImageViewself.test.ImageViewSelf

<Imagetest.test.ImageViewSelf
	android:id="@+id/board"
	android:layout_width="fill_parent"
	android:layout_height="wrap_content"></Imagetest.test.ImageViewSelf>

  3.修改main.java

	public void onCreate(Bundle savedInstanceState) {	
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		// 通过findViewById获得ImageView
		board = (ImageViewSelf) findViewById(R.id.board);
		// 为ImageView设置图片资源
		board.setImageResource(R.drawable.board);
		// 通过findViewById获得ImageButton
		piece = (ImageButton) findViewById(R.id.piece);
		// 为ImageButton设置图片资源
		piece.setImageResource(R.drawable.piece);
		//添加监听器
		piece.setOnClickListener(cl);
	}
	//	实例化一个按键监听器
	private Button.OnClickListener cl = new Button.OnClickListener() {
		public void onClick(View v) {
			//调用intitImage方法,设置图片资源
			board.initImage();
			//刷新board,手动调用onDraw
			board.invalidate();
		}
	};
	// 图片视图ImageView
	private ImageViewSelf board;
	private ImageButton piece;

}

  4.修改完毕后,运行程序,开始棋盘上是没有棋子的,点击按钮后,执行initImage()和invalidata()方法后,期盼上会出现一个棋子。

程序运行结果如附件中imagetest2.jpg

 

paint类可以设置画笔的颜色等参数,canvas中提供了各种画图形的方法,如画图片、圆形、矩形等

以上两个类结合起来使用也就相当于java的Graphics。

android画图的例子也就完成了!

 

第一个例子的全部代码及文件在imagetest压缩文件中

第二个例子的全部代码及文件在imagetest2压缩文件中

未解决问题:

1.使用语句bitmap = Bitmap.createBitmap(BitmapFactory.decodeResource(getResources(),R.drawable.piece));得到的图像大小比真实稍小。   ??

2.ImageViewSelf中构造方法中各参数的含义。 ??

 

续:关于之前所提到的第一个问题:可以使用Rect 来控制绘画图片的大小。

使用 canvas. drawBitmap (Bitmap bitmap, Rect src, RectF dst, Paint paint)

 其第一个Rect src 是所需要绘制的bitmap图片的区域,需要注意rect的构造方法中四个参数为左坐标,上坐标,右坐标及下坐标。

并不是java所习惯的左坐标,上坐标,宽度及高度。 

第二个Rect  dst 表示的是在view中的哪个区域绘制图片。
       例:

     Rect src = new Rect(0, 0,35,35);

	Rect dst = new Rect(50,50, 90,90);
	 canvas.drawBitmap(cursor,src,dst,paint);

    以上代码表示在view中的dst区域内,绘制bitmap对象cursor的0,0,35,35的图像。

    两个Rect大小不一致是没有关系的,绘制时会自动填充。

  • 大小: 82.5 KB
  • 大小: 83.9 KB
2
1
分享到:
评论

相关推荐

    Android 动画实现几种方案

    Android 动画实现几种方案 在 Android 的 FrameWork 中,为我们提供三种动画的实现方式:逐帧(Frame)动画、视图/补间动画(View Animation)和属性动画(Property Animation)。由于,这三种动画的实现方式和针对...

    Android 安卓生成4种图片动画效果.rar

    Android 安卓生成4种图片动画效果,可用于画廊、画册、图库壁纸、相框应用中,这几种渐变分别是图片渐变(淡入淡出)Alpha透明度变化、图片拉伸由大到小Scale、图片移位Translate、图片旋转Rotate如演示截图所示,...

    Android截屏截图的几种方法总结

     Android截屏的原理:获取具体需要截屏的区域的Bitmap,然后绘制在画布上,保存为图片后进行分享或者其它用途 一、Activity截屏 1、截Activity界面(包含空白的状态栏) /** * 根据指定的Activity截图(带空白...

    Android 图片点击后分裂成几份消失 QuickSand项目源码

    下面几种设置动画: ViewPropertyAnimator animateText = findViewById(R.id.simple_anim_text) .animate() .setDuration(5000) .scaleXBy(.5f); Quicksand.trap(KEY_SIMPLE_ANIMATE_TEXT, animateText);

    Android实现图片轮播效果的两种方法

    大家在使用APP的过程中,经常会看到上部banner图片轮播的效果,那么今天我们就一起来学习一下,android中图片轮询的几种实现方法: 第一种:使用动画的方法实现:(代码繁琐) 这种发放需要:两个动画效果,一个布局,...

    Android中实现圆角图片的几种方法

    Android中实现圆角图片有多种姿势,不知你解锁了几种? 方法一:setXfermode法 此种方式就是再new一个相同尺寸的bitmap,然后使用paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));先画圆角矩形,再画原始...

    Android动画 实现开关按钮动画(属性动画之平移动画)实例代码

    另外说到动画,在Android里面支持3种动画: 逐帧动画(Frame Animation)、补间动画(Tween Animation)和属性动画(Property Animation),至于这几种动画的区别这里不再介绍,希望开发者都能在使用的过程中体会两者的...

    android开发资料大全

    Android Wifi方法大全【总有一种方法适合你】 android开发环境搭建篇详尽的教程实例汇 图形图像之图像处理(缩放 旋转 转化) android开发之【腾讯微博android客户端开发】Parameter类和SyncHttp 网友自己写的...

    android实现支付宝咻一咻的几种思路方法

    下面我们将一一介绍这几种思路的实现过程。 1.自定义View实现咻一咻 那么这种实现方法需要掌握Canvas以及Paint几乎所有的方法。其对程序员的专业知识要求极高。 用该种方式实现的优点有: ㈠这种是最复杂的实现方法...

    Android studio照片拖拽、放大查看处理多指触摸事件demo

    通过对Touch事件的几种状态处理完成照片的放大,缩小、拖拽等功能

    android view实现一张图片的渐隐效果

    因为一个Android项目的缘故要在软件打开界面轮流显示两张照片,不想让两张图片替换的太生硬,所以让其中一张图片渐隐,逐渐显示第二张图片。...本文重点介绍这一种方法。(在view中绘画) 第三种: 前两种都

    Android播放多张图片形成的一个动画示例

    在Android里可以逐帧的播放图片,然后产生一种动态的效果,准备好几张连续的图片,然后在于源程序res文件夹下建立anim文件夹,然后新建一个XML XML代码如下: &lt;?xml version=1.0 encoding=utf-8?&gt; ...

    新版Android开发教程.rar

    开放手机联盟包括手机制造商、手机芯片厂商和移动运营商几类。目前,联盟成员 数 量已经达到了 43 家。 移动手机联盟创始成员: Aplix 、 Ascender 、 Audience 、 Broadcom 、中国移动、 eBay 、 Esmertec 、谷歌、...

    Android 面试宝典

    另一种Frame动画,传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影. 6. 什么是嵌入式实时操作系统,Android操作系统属于实时操作系统吗? 嵌入式实时操作系统是指当外界事件或数据产生时,能够接受并以足够...

    Android自定义ImageView实现自动放大缩小动画

    因为我想在ViewPager实现图片放大缩小的动画,但是ViewPager几个页面的动画会一起动,而且放大全屏图片的话会相互覆盖,很诡异。于是上网搜demo,一无所获。迫于无奈。。。 废话不多说,直接贴代码。 1.配置文件...

    Android炫酷界面刷新

    多达十几种界面刷新样式,下拉刷新动画,上拉数据加载动画 下拉特效,弹力恢复等 内有图片展示

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    Android 一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导开发 IOS 由苹果公司开发的移动操作系统 Webkit 一个开源的浏览器引擎,在手机上的...

    Android自定义View实现支付宝支付成功-极速get花式Path炫酷动画

    本文手把手教你图片-&gt;SVG-&gt;Path的姿势.。 ...所以内置了几种将别的资源-&gt;Path的方法: 直接传string。(A-Z,0-9 “.” “- ” “)  //根据String 转化成Path setSourcePath(PathParserUtils.

Global site tag (gtag.js) - Google Analytics