图形图像处理 补间 逐帧 属性动画 SurfaceView Bitmap

来源:互联网 发布:雪地靴推荐知乎 编辑:程序博客网 时间:2024/05/10 18:52
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));    }}
0 0
原创粉丝点击