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);}@Overrideprotected 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方法,直接上代码,里面有注释:
@Overrideprotected 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的方式修改如下:
@Overrideprotected 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的方式修改如下:
@Overrideprotected void onDraw(Canvas canvas) {//图片test.png在本机的路径String imgpath = Environment.getExternalStorageDirectory()+\"test.png\";//创建位图对象Bitmap bitmap = BitmapFactory.decodeFile(imgpath);//挖取一部分图片创建;参数:图片,图片被挖左上角xy,被挖右下角xyBitmap 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方法:
@Overrideprotected 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方法:
@Overrideprotected 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 {@Overrideprotected 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\"><ImageViewandroid: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 {@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.donghua_acitivty);init();}private void init() {ImageView img = findViewById(R.id.img);//获得动画资源,参数:上下文,动画资源文件idAnimation animation = AnimationUtils.loadAnimation(this,R.anim.toumingdu);//组件开始补间动画img.startAnimation(animation);}}
2、下面是旋转动画的举例:
跟透明度渐变动画相比就是新建资源文件不同
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 {@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.donghua_acitivty);init();}private void init() {ImageView img = findViewById(R.id.img);//获得动画资源,参数:上下文,动画资源文件idAnimation 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]);
解释一下:
首先是创建动画组,然后将这个组用个组件的每一个图片