【Android-基础】动画代码,做一些简单的动画

【Android-基础】

点击进入【Android-基础】的目录,获得更多学习资源


前言

无论是自定义控件还是需要一些动态效果,动画总是不可避免的出现在我们的日常开发中。
但是动画这一小块其实很多时候并不是常用的,所以大多数程序员(比如我)经常用到了,临时看一下怎么使用。所以,这里我总结了一些比较基础的动画效果。如下:
paint、canvas、逐帧动画、补间动画、透明、旋转、平移、淡入淡出、路径绘制等简单例子


一、简单介绍

android绘制界面需要画笔Paint和画布Canvas

二、绘制简单的矩形:

1、步骤:
①自定义类继承View,重写onDraw方法
②在onDraw中利用paint以及onDraw的参数canvas绘制
③在acitivity中渲染
2、代码:
自定义类继承View的HuaJuXing.java:

public class HuaJuXing extends View {
    public HuaJuXing(Context context) {
        super(context);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        //创建画笔
        Paint paint = new Paint();
        //填充样式
        paint.setStyle(Paint.Style.FILL);
        //五个参数:矩形左上角xy,右下角xy,画笔
        canvas.drawRect(10,10,40,40,paint);

        super.onDraw(canvas);
    }
}

渲染TestActivity.java:

//LinearLayout是这个activity的xml的最外层布局
LinearLayout l = findViewById(R.id.ll);
l.addView(new HuaJuXing(this));

三、绘制文本:

这个和上一个不同之处在于onDraw方法,直接上代码,里面有注释:

    @Override
    protected void onDraw(Canvas canvas) {
        //创建画笔
        Paint paint = new Paint();
        //填充样式
        paint.setStyle(Paint.Style.FILL);
        //抗锯齿
        paint.setAntiAlias(true);
        //参数:文本,文本xy,画笔
        canvas.drawText("nihao",10,10,paint);
        super.onDraw(canvas);
    }

四、绘制图片:

绘制图片就需要位图对象Bitmap,
创建位图对象Bitmap有两种方式:
使用BitmapFactory以及使用Bitmap

BitmapFactory创建位图有下面两种方式:
通过图片文件创建(decodeFile方法是用文件的路径;decodeResource方法使用文件资源ID创建)、
通过文件输入流创建(decodeStream方法)。

Bitmap创建位图有三种方式:
挖取图片一部分创建(createBitmap方法)、
缩放图片创建(createScaledBitmap方法)、
文件输出流创建(compress方法)。

绘制图片和绘制矩形差不多,也是重写onDraw方法,
使用BitmapFactory.decodeFile的方式修改如下:

    @Override
    protected void onDraw(Canvas canvas) {
        //图片test.png在本机的路径
        String imgpath = Environment.getExternalStorageDirectory()+"test.png";
        //创建位图对象
        Bitmap bitmap = BitmapFactory.decodeFile(imgpath);
        //绘制图片;参数:图片bitmap,xy坐标,画笔
        canvas.drawBitmap(bitmap,10,10,new Paint());

        super.onDraw(canvas);
    }

使用挖取图片一部分创建 Bitmap.createBitmap的方式修改如下:

    @Override
    protected void onDraw(Canvas canvas) {
        //图片test.png在本机的路径
        String imgpath = Environment.getExternalStorageDirectory()+"test.png";
        //创建位图对象
        Bitmap bitmap = BitmapFactory.decodeFile(imgpath);
        //挖取一部分图片创建;参数:图片,图片被挖左上角xy,被挖右下角xy
        Bitmap bitmap1 = Bitmap.createBitmap(bitmap,10,10,40,40);
        //绘制图片;参数:位图,绘制左上角xy,画笔
        canvas.drawBitmap(bitmap1,10,10,new Paint());
        super.onDraw(canvas);
    }

注意使用涉及文件路径的方式,需要权限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

五、绘制路径:

绘制路径需要用到Path类,这个类有四种方法:
addArc方法:绘制1/4圆;addCircle:绘制圆形;addRect:绘制矩形;addRundRect:绘制圆角矩形
下面举例绘制圆形路径:
还是重写 onDraw方法:

    @Override
    protected void onDraw(Canvas canvas) {
        Paint paint = new Paint();
        //抗锯齿
        paint.setAntiAlias(true);
        //设置填充样式为描边
        paint.setStyle(Paint.Style.STROKE);
        Path path = new Path();
        //参数:xy坐标,半径,顺逆时针的路径,下面是逆时针
        path.addCircle(150,100,50,Path.Direction.CW);
        //绘制显示路径
        canvas.drawPath(path,paint);
        super.onDraw(canvas);
    }

下面举例在路径上绘制文本:
还是重写 onDraw方法:

    @Override
    protected void onDraw(Canvas canvas) {
        Paint paint = new Paint();
        //抗锯齿
        paint.setAntiAlias(true);
        //设置填充样式为描边
        paint.setStyle(Paint.Style.STROKE);
        Path path = new Path();
        //参数:xy坐标,半径,顺逆时针的路径,下面是逆时针
        path.addCircle(150,100,50,Path.Direction.CW);
        //参数:文本,路径,偏移量xy,画笔
        canvas.drawTextOnPath("hahahahahhahah",path,0,0,paint);
        super.onDraw(canvas);
    }

六、逐帧动画:

首先知道逐帧动画其实原理是因为人眼的视觉遗留。
1、步骤:
①创建动画资源文件,并在里面设置多个显示的图片
②使用上面的资源文件
③控制动画开始与停止
2、代码:
首先在res的anim创建文件(也可以在drawable创建):
zhuozhen.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/icon1" android:duration="60"/>
    <item android:drawable="@drawable/icon2" android:duration="60"/>
    <item android:drawable="@drawable/icon3" android:duration="60"/>
    <item android:drawable="@drawable/icon4" android:duration="60"/>
    <item android:drawable="@drawable/icon5" android:duration="60"/>
    <item android:drawable="@drawable/icon6" android:duration="60"/>
</animation-list>

然后要使用,在activity的最外层布局引用这个文件当背景:
donghua_activity.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:id="@+id/ll"
    android:layout_height="match_parent"
    android:background="@drawable/zhuozhen"
    android:orientation="vertical">
</LinearLayout>

然后是代码中控制开始,用start方法:
TestActivity.java文件:

public class TestActivity extends Activity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.donghua_acitivty);
        init();
    }

    private void init() {
        LinearLayout l = findViewById(R.id.ll);
        //获取动画文件
        AnimationDrawable animationDrawable = (AnimationDrawable) l.getBackground();
        //动画开始
        animationDrawable.start();
    }
}

七、补间动画:

补间动画原理:定义一个起始帧和一个终止帧,然后中间的都是计算机帮你计算生成。
android存在四种补间动画:
透明度渐变动画、旋转动画、缩放动画、平移动画。

1.透明度渐变动画的举例

首先是动画资源文件toumingdu.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <alpha android:fromAlpha="0" android:toAlpha="1" android:duration="6000"/>
</set>

解释一下:fromAlpha和toAlpha相当于从透明度0(完全透明)到透明度1(完全不透明)duration就是持续时间,这里设置6秒
然后是应用这个资源文件的activity的xml文件:
donghua_activity.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <ImageView
        android:id="@+id/img"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/icon6" />
</LinearLayout>

最后是这个activity的文件:
TestActivity.java文件:

public class TestActivity extends Activity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.donghua_acitivty);
        init();
    }

    private void init() {
        ImageView img = findViewById(R.id.img);
        //获得动画资源,参数:上下文,动画资源文件id
        Animation animation = AnimationUtils.loadAnimation(this,R.anim.toumingdu);
        //组件开始补间动画
        img.startAnimation(animation);
    }
}

1.旋转动画的举例

跟透明度渐变动画相比就是新建资源文件不同
xuanzhuan.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <rotate android:fromDegrees="0" android:toDegrees="360" android:pivotX="50%" android:pivotY="50%" android:duration="6000"/>
</set>

解释一下:fromDegrees=“0” android:toDegrees="360"就是从0度旋转到360度,android:pivotX=“50%” android:pivotY="50%"就是旋转轴,这里取的图片的xy长度各一半
activity的文件只需要更换下动画资源文件名即可:
TestActivity.java文件:

public class TestActivity extends Activity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.donghua_acitivty);
        init();
    }

    private void init() {
        ImageView img = findViewById(R.id.img);
        //获得动画资源,参数:上下文,动画资源文件id
        Animation animation = AnimationUtils.loadAnimation(this,R.anim.xuanzhuan);
        //组件开始补间动画
        img.startAnimation(animation);
    }
}

3、下面是缩放动画的举例:
跟透明度渐变动画相比就是新建资源文件不同
suofang.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <scale android:fromXScale="1" android:fromYScale="1" android:toXScale="2" android:toYScale="2" android:pivotX="50%" android:pivotY="50%" android:duration="6000"/>
</set>

解释一下:android:fromXScale=“1” android:fromYScale=“1” android:toXScale=“2” android:toYScale="2"就是缩放xy长度从1倍到2倍。
activity的文件只需要更换下动画资源文件名即可。

4、下面是平移动画的举例:
跟透明度渐变动画相比就是新建资源文件不同
pingyi.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="0" android:fromYDelta="0" android:toXDelta="100" android:toYDelta="100" android:duration="6000"/>
</set>

解释一下:android:fromXDelta=“0” android:fromYDelta=“0” android:toXDelta=“100” android:toYDelta="100"就是图片从左上角xy坐标0,0平移到100,100
activity的文件只需要更换下动画资源文件名即可。


八、淡出淡入效果:

淡出淡入其实就是透明度渐变
从第一张图的不透明变成透明,到第二张图的透明变成不透明。
所以先做两个透明渐变的资源文件:
danchu.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <alpha android:fromAlpha="1" android:toAlpha="0" android:duration="6000"/>
</set>

danru.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <alpha android:fromAlpha="0" android:toAlpha="1" android:duration="6000"/>
</set>

然后再需要的地方,一般是activity中(核心代码):

        Animation[] animations = new Animation[2];
        //淡出
        animations[0] = AnimationUtils.loadAnimation(this,R.anim.danchu);
        //淡入
        animations[1] = AnimationUtils.loadAnimation(this,R.anim.danru);
        //组件,一般是ViewFlipper,这里以ViewFlipper为例
        //flipper的每一个图片淡出
        flipper.setInAnimation(animations[0]);
        //flipper的每一个图片淡入
        flipper.setOutAnimation(animations[1]);

解释一下:
首先是创建动画组,然后将这个组用个组件的每一个图片


总结

这些都是比较基础的关于Android的动画效果,代码都是比较简单,看一眼就能理解的,方便立马拿来复习一下,然后去使用的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值