【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的动画效果,代码都是比较简单,看一眼就能理解的,方便立马拿来复习一下,然后去使用的。