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

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
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋葵好吃吗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值