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"><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大小不一致是没有关系的,绘制时会自动填充。
更多相关文章
- 浅谈Java中Collections.sort对List排序的两种方法
- Python list sort方法的具体使用
- python list.sort()根据多个关键字排序的方法实现
- android上一些方法的区别和用法的注意事项
- android实现字体闪烁动画的方法
- Android(安卓)matrix 控制图片的旋转、缩放、移动
- Android中dispatchDraw分析
- 锁屏界面
- Android四大基本组件介绍与生命周期