package com.example.tyxiong.myapplication;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import java.util.ArrayList;
import java.util.List;
/*
1 用ImageView显示图片
2 用AnimationDrawable开发逐帧动画
3 用Animation开发补间动画.
* Bitmap BitmapDrawable BitmapFactory 三者关系
* 1 Bitmap代表一个位图对象.自己有4静态方法构建Bitmap 从源图挖生成 源图挖取并进行Matrix变换 对源位图缩放生成 生成尺寸的Bitmap
* 2 BitmapDrawable包装了一个位图. 通过new包装Bitmap 其getBitmap()方法可取出其中的Bitmap
* 3 BitmapFactory工具类,有方法4个从不同来源解析创建Bitmap对象.
* Bitmap用后需要回收自己 2方法 isRecyled() recely()
*
* Canvas:依附于View的画布
* 大量绘制各种图形 线 点的方法+4方法进行画布坐标系(左上为0,0)变换. 其实是两个坐标系.
*
* Paint:画布上的笔 实际上我觉得Canvas才是笔..
* 11方法进行画笔设置,其中5个 笔触宽度/笔触转弯/填充风格/填充效果/路径填充效果 strokewidth strokejoin style shader pathEffect
*
*Path 1首先创建一条路径 2用Canvas的drawPath()方法绘制出来.
* 3步: 1路径
* 2Paint 设置pathEffect 6子类
* 3Canvas 绘制出来.
*
* 重调组件的onDraw()方法重绘组件.UI线程中用invalidate(); 非主线程用postinvalidate()
*
*双缓冲即: 需要实时重绘组件onDraw()且要保留先前的状态. 先绘制(用Canvas绘制路径之类的,不会盖之前)到大小相同的缓冲区,再一起绘制到组件.
*
*使用Matrix控制变换. Bitmap有方法 创建Bitmap并应用Matrix变换
* 3步: 1创建Matrix对象(也可从其他对象获取)
* 2对Matrix进行变换(4种变换 位移/缩放/旋转/倾斜 translation/scale/rotate/skew)
* 3把这种变换应用于指定对象.
*
* drawBitmapMesh 扭曲图像 这是Canvas的draw方法, 即将图像分成很多小网格 事件点的小距离变换 绘制出来.
*
* shader Paint的 方法填充效果 5子类 BitmapShader/LinearGradient/RadialGradient/SweepGradient/ComposeShader
*
* 逐帧动画Frame 大量静态图片集中起来,依次显示
* xml 根元素animation-list 1属性name 子元素item 2属性 drawable duraing
* java 1创建AnimationDrawable对象 2 方法addFrame()添加一帧
默认是不播放的. start() stop()
补间动画Tween Anmation为其抽象类 4子类TranslateAnimation AlphaAnimation Scale.../Rotate..
java 设置开始帧 结束帧 持续时间 Interpolator则控制插值.
自定义补间:继承基类Animation,重写applyTransformation()
属性动画:增强版的补间动画.
区别:补间动画仅对4个属性方面的变化; 属性动画能定义任何属性的变化.
补间动画仅能对UI组件执行动画;属性动画能对任何对象执行动画(不管是否显示.).
6相似:都需要指定如duraing/interpolator/repateMode/repateCount/刷新频率/组合
4API Animator ValueAnimator ObjectAnimator AnimatorSet
* Animator:基类被继承
* ValueAnimator:性动画的时间引擎,只负责计算各帧的属性值So要监听计算的值..它不管为对象设置值.我们来负责.
* java方式使用步骤4:1用静态方法(3个)ofInt()/ofFloat(start,end)获取ValueAnimator动画对象.
* 2设置动画的属性设置如:duration/repeatMode
* 3调用动画对象方法start()开始动画.
* 4为动画设置监听AnimatorUpdateListener,监听计算出来的值,并将值应用到对象组件上.
*
* ObjectAnimator:ValueAnimator的子类,允许对指定对象的属性执行动画.简单些.
* java方式使用步骤3: 1同样静态方法ofxxx(动画应用的对象,应用的属性,属性开始值,结束值)
* 后两步同上.无须设置监听器它会帮我把值应用到属性上.
* 3注意点:需要为对象的该属性设置setter()方法,这是对自定义组件而言的.
* 若属性值只设置了一个,则认为是结束值,还需提供getter()方法,的值作为开始值.
* 动画应用的对象为View的话,可能要在onAnimationUpdate()方法里手动调用invlidate()重绘.
* AnimatorSet:组合动画,同时,依次
* Evaluator 控制如何计算属性值..4子类 int/string/argb/TypeEvaluator(用于实现自定义计算器)
*
View有3缺点:1 onView()重绘时会重绘整个图片
2 新线程无法直接更新View组件
3 缺乏双缓冲机制.
*
* SurfaceView概述4:1 SurfaceView对应于屏幕上的一块缓存区.
* 2 普通View共享一块缓存区.
* 3 View绘制在SurfaceView上面.
* 4 每个Window对应一个Surface(内有Canvas)
* SurfaceView在游戏时实显示有优势.
SurfaceHolder:用于在其对应的SurfaceView上绘制图像.
使用步骤4:1 获取SurfaceView对象上的SurfceHolder对象 getHolder()
2 SurfaceHolder对象方法lockCanvas()获取SurfaceView上的Canvas
3 Canvas进行绘制
4 SurfaceHolder方法unlockCanvas() 释放,提交绘制.
还可以实现SurfaceHolder内部接口Callback,监听SurfaceView的生命状态.
*
*
*
*
*
* */
public class MainActivity extends Activity {
private List<Bitmap> list = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ImageView imageView = (ImageView) findViewById(R.id.imageView2);
BitmapDrawable drawable= (BitmapDrawable)getResources().getDrawable(R.drawable.icon4);
assert drawable != null;
Bitmap bitmap = drawable.getBitmap();
imageView.setImageBitmap(Bitmap.createBitmap(bitmap, 0, 0, 160, 200));
}
}
图形图像处理 补间 逐帧 属性动画 SurfaceView Bitmap
最新推荐文章于 2023-03-24 15:13:07 发布