图片处理

Android图形

一、绘制几何图形

a) 设置我们的画布(canvas),就好比我们画画所需要的那张纸是一样的,它没有默认的构造函数,我们一般是通过写一个类继承自view对象,然后实现它的draw方法,这个方法的参数就会有一个canvas参数。通过canvas对象,我们可以设置画布的背景颜色。

b) 创建我们的paint对象,这就是我们的画笔。我们可以通过set方法设置我们的颜色、画笔的类型。


class myview extends View {
public myview(Context context) {
super(context);
}
public void draw(Canvas c) {
c.drawColor(Color.WHITE);
Paint p = new Paint();
p.setColor(Color.BLACK);
//在使用rect的时候,你应该注意一下各个参数的意义,left,top,right,bottom,刚开始的时候,我将他们设置成为相同的值,发现它不出来,而划线的时候线条使出来的,后来认真看参数的意义才发现,原来是这样。其中代码的眼球是left<=right,top<=bottom,因为android手机的坐标远点是左上角的顶点。
Rect r = new Rect(100, 120, 120, 100);
c.drawRect(r, p);
    c.drawLine(0, 0, 100,100, p);    
}


通过这些画图基本上就是这样,你可以给他设置一些画笔的属性paint.setstyle,从而可以产生另外的一些效果。

二、加载动画

a) Frame动画通过animationdrawable来实现

b) 加载动画的方式有两种

  

1、通过xml文件加载动画

a、首先在res目录下创建一个文件夹anim(名字随意),然后在这个目录下创建一个xml文件,内容如下

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:apk="http://schemas.android.com/apk/res/android" apk:oneshot="false">
    <item apk:drawable="@drawable/p01" apk:duration="500" />
    <item apk:drawable="@drawable/p02" apk:duration="500" />
    <item apk:drawable="@drawable/p03" apk:duration="500" />
    <item apk:drawable="@drawable/p04" apk:duration="500" />
</animation-list>

b、在layout布局文件中申明一个imageview,并将它的背景指定到你创建的xml文件夹android:background="@anim/dh"这样我们的准备工作就做好了,第一行是每个xml都有的,下面一行的animation-list是固定写法,每一个item都指定了图片的来源,还有显示时间

   c、通过imageviewfindviewbyid来获取指引,然后调用它的getbackground方法,这个方法将会返回一个drawable值,刚开始就是我们的item的第一项(因为我们的imageview指定背景指定的是我们创建的xml文件,里面的第一个item就是我们的初始背景)。然后将我们的drawable向下转型变为animationdrawable就行了。

   这样我们的第一个动画就做好了。

   代码名称:---donghua

 2、通过在代码中制作动画

    这个是比较困难,但是也是经常会使用的一项技术。

a、在布局文件中申明一个imageveiw,因为drawable(包括它所有的子类)都是不能显示出来的,如果想要显示出来必须借助于别的对象(比如iamgeview,作为背景图片被设置进去)。

b、我们在按钮的监听器里实现下面的代码,通过activity自带的getresources来获取系统资源,然后再点方法得到我们的drawable对象(注意,这里得到的drawablebitmapdrable,如果你强行将它转换为animationdrawable的话是会报错的),它只能作为一针也就是一个frame添加到animationdrable里面去。然后我们通过imageview将我们的animationdrable作为背景图设置进去。


setContentView(R.layout.activity_main);
    ad=new AnimationDrawable();
iv=(ImageView)findViewById(R.id.iv1);
bt=(Button)findViewById(R.id.bt1);
bt.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
for(int i=1;i<=2;i++){
String s=String.valueOf(i);
System.out.println(s);
int id=MainActivity.this.getResources().getIdentifier("p0"+s, "drawable", MainActivity.this.getPackageName());
  //不能将一个bitmapdrawable转换为一个animationdrawable
Drawable dd=MainActivity.this.getResources().getDrawable(id);
ad.addFrame(dd, 200);
iv.setBackground(ad);
ad.setOneShot(false);
    ad.start();
}
}
});

实际上是因为我们两次加载的 frame ad.addFrame(dd, 200);)都没有被释放掉,相当于说我们的 animationdrawable 中有两针动画(学过 flash 的应该很容易理解,没学过的可以理解为里面有两张图片,每一张算一针,他们共同构成了 animationdrable 。或者你也可以理解为 animationdrable 就是一个动态图片),而我们的 iamgeview 是将我们的 animationdrawable 作为背景,因此它会重复显现。这效果就像是我们将一个动态图片作为背景图是一样的。所以,即使我没有 for 循环,它也会是一个不断走动的图片的。c 、当然,这里存在一个小小的问题,细心的应该会发现,在代码中我的 for 循环只循环了两次,但是它却可以重复这两个动作一直走下去。而我的打印语句却也只打印了两次。这是为什么了?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值