习惯了使用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"><ImageViewandroid:id="@+id/board"android:layout_width="wrap_content"android:layout_height="wrap_content"></ImageView><ImageButtonandroid: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. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);// 通过findViewById获得ImageViewboard = (ImageView) findViewById(R.id.board);// 为ImageView设置图片资源board.setImageResource(R.drawable.board);// 通过findViewById获得ImageButtonpiece = (ImageButton) findViewById(R.id.piece);// 为ImageButton设置图片资源piece.setImageResource(R.drawable.piece);}// 图片视图ImageViewprivate 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.ImageViewSelfandroid: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获得ImageViewboard = (ImageViewSelf) findViewById(R.id.board);// 为ImageView设置图片资源board.setImageResource(R.drawable.board);// 通过findViewById获得ImageButtonpiece = (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,手动调用onDrawboard.invalidate();}};// 图片视图ImageViewprivate 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(Bitmapbitmap,Rectsrc,RectFdst,Paintpaint)

其第一个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大小不一致是没有关系的,绘制时会自动填充。

更多相关文章

  1. 浅谈Java中Collections.sort对List排序的两种方法
  2. Python list sort方法的具体使用
  3. python list.sort()根据多个关键字排序的方法实现
  4. android上一些方法的区别和用法的注意事项
  5. android实现字体闪烁动画的方法
  6. Android(安卓)matrix 控制图片的旋转、缩放、移动
  7. Android中dispatchDraw分析
  8. 锁屏界面
  9. Android四大基本组件介绍与生命周期

随机推荐

  1. Android多媒体开发
  2. 自定义Android键盘
  3. Android新的menu实现——ActionMode
  4. 使用 Eclipse PhoneGap 构建 Android(安
  5. Android(安卓)任务、进程和线程
  6. Android(安卓)自定义camera压缩图片到指
  7. Android数据存取之Preferences
  8. Android(安卓)JNI开发入门之二
  9. android的简单理解(原创)
  10. Android自动化测试工具——Monkey