`
heweiding155
  • 浏览: 29632 次
  • 性别: 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 动画有两种:Tween Animation 和 Frame Animation。本文主要介绍 Tween Animation 的实现, Tween Animation 是对视图对象中的内容进行一系列简单的转换,比如位置...

    安卓手绘图片处理画板相关-Android图片模糊高斯模糊毛玻璃的三种实现方法.rar

    在Android开发中,图片处理是一项...在实际开发中,可以结合这几种方法,以实现最佳的视觉效果和性能平衡。注意,由于资源中提到的部分代码可能需要根据实际情况进行调整才能运行,所以开发时还需要自行调试和适配。

    Android 帧动画优化实现可减少内存使用

    在Android开发中,帧动画(Frame Animation)是一种常见的动态效果实现方式,它通过连续播放一系列静态图片来模拟动画效果。然而,如果不进行优化,帧动画可能会导致内存消耗过大,影响应用性能,甚至引发ANR...

    ListView加载图片处理错位的几种方法、图片缓存、listView简单动画

    本篇文章将详细探讨ListView加载图片处理错位的几种方法,以及如何进行图片缓存和添加简单动画。 1. 图片加载错位: 这个问题通常发生在ListView的滚动过程中,由于复用机制,当一个列表项被回收并用于显示其他...

    Android animation的结合蝴蝶飞的动画,使用动画里面的几种类型-IT计算机-毕业设计.zip

    这个压缩包"Android animation的结合蝴蝶飞的动画,使用动画里面的几种类型-IT计算机-毕业设计.zip"包含了一个Android应用源码Demo,专门展示了如何利用Android内置的动画机制创建一个蝴蝶飞舞的效果。这个案例非常...

    android 逐帧动画

    如果需要倒序播放,一种方法是在动画结束时手动设置回第一帧,然后再次启动动画。另一种更灵活的方式是使用`ValueAnimator`,通过监听器控制动画的播放顺序。 **三、更复杂的动画控制** 虽然`AnimationDrawable`...

    android 跑马灯图片展示+10种切换特效

    在Android应用开发中,"跑马灯图片展示"是一种常见的动态效果,通常用于广告轮播、通知滚动等场景。跑马灯效果通过不断移动图片或文字来实现视觉上的连续滚动,给用户带来新颖的交互体验。本文将详细介绍如何利用`...

    android gif图片循环显示

    要实现在Android应用中显示GIF图片,我们可以使用以下几种方法: 1. **利用第三方库**:由于Android原生API对GIF支持有限,通常我们会借助第三方库,如`NineOldAndroids`(用于兼容早期Android版本)和`Glide`、`...

    Android 吸入式动画

    2. **帧动画**与**属性动画**:Android提供了两种动画机制,一种是帧动画(Frame Animation),适用于连续播放的一系列图片;另一种是属性动画(Property Animation),可以改变对象的属性,如位置、大小等,更适合...

    Android 循环背景动画

    在Android中实现循环背景动画通常涉及到以下几个关键步骤: 1. **引入依赖**:由于题目提到"需要添加v7包",这可能指的是Android Support Library v7,它包含了一些对老版本Android系统支持的UI组件和工具。为了...

    Android代码-animation的结合蝴蝶飞的动画使用动画里面的几种类型.zip

    "Android代码-animation的结合蝴蝶飞的动画使用动画里面的几种类型.zip"这个资源包显然包含了如何在Android应用中实现蝴蝶飞舞的动画效果,涉及到Android动画的不同类型。以下是关于Android动画及其在该示例中应用的...

    Android 等待提示动画源码

    首先,Android中的等待提示动画主要有两种类型:线性进度条(ProgressBar)和自定义动画。线性进度条是系统内置的控件,可设置为水平或垂直显示,有固定样式。自定义动画则允许开发者根据需求设计独特的动画效果。 ...

    android逐帧动画

    在Android平台上,逐帧动画是一种常见且直观的动画实现方式,尤其适用于创建简单的连续图像序列,比如行走、跳跃等动作效果。在这个特定的案例中,我们看到标题为“android逐帧动画”,描述提到有三张图片进行切换,...

    android几种图形特效

    本文将深入探讨几种常见的Android图形特效,包括图片的圆角、图片的缩放、图片的倒影以及图片的旋转,这些都是Android开发者需要掌握的基本技能。 首先,我们来看如何实现图片的圆角效果。在Android中,可以使用...

    Android 动画实现几种方案

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

    android 转圈等待动画

    首先,Android提供了几种内置的等待动画样式,如ProgressDialog、ProgressBar以及Material Design中的CircularProgressIndicator。ProgressDialog是一个模态对话框,显示一个圆形旋转的进度条,适合在API级别16及...

    android 动画轨迹

    要实现Android中的动画轨迹,我们可以使用以下几种技术: 1. **Property Animation**:这是Android 3.0及以上版本引入的一种动画系统,它可以独立于视图的绘制过程来改变对象的属性。我们可以使用ValueAnimator和...

Global site tag (gtag.js) - Google Analytics