android 画图片的几种方法

本文详细介绍了在Android应用中使用ImageView控件和View类的onDraw方法进行图形与图片绘制的方法,包括使用setImageResource方法快速加载图片,以及自定义View类通过onDraw方法实现复杂图形绘制。同时,通过实例演示了如何调整图片大小和位置,并讨论了构造方法的作用。文章还解答了使用Bitmap创建图片时尺寸偏小的问题,提供了使用Rect来精确控制图片大小的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

习惯了使用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大小不一致是没有关系的,绘制时会自动填充。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值