如何实现模拟相机光圈改变的动画

博客介绍了如何在Android中创建一个模拟相机光圈变化的动画,通过自定义View来实现。文章指出原作者的实现存在锯齿问题,然后详细讲解了如何优化这个问题,利用Xfermode进行抠图并消除锯齿,提供了相关代码示例和布局文件。
摘要由CSDN通过智能技术生成

最近有项目上的需要,需要在相机中实现一个UI用于控制相机拍出照片的清晰或者模糊区域的大小。哎~,没什么文采,说不清楚,还是直接上效果图来的实在一点!!!
改善前改善后

不要问我为什么同样的效果图给了两个,我会慢慢说明的!!
首先声明,这个动画不是我做的,如果想看原文的话,请跳转至下面这个链接:
http://blog.csdn.net/ha000/article/details/53376099
博主写的很好,就是有一点不是很好,博主在代码中使用path来进行视图的剪切,但是在绘制path的时候会产生锯齿,而画笔上的设置无法消除使用path剪切所造成的锯齿,很不美观,因此我被boss要求进行优化,也就是消除锯齿!!!

在进行图片的剪切或者说是抠图的时候,我们除了使用path以外,我们还可以使用Xfermode,通过使用Paint设置相关的模式完全可以达到抠图的目的,关于Xfermode将会在明天的博客中介绍,有兴趣的朋友可以关注一下我的博客!!

好了,扯了这么多也该上源码了,先看一下使用path进行抠图的源码:
ApertureView:

package com.example.apertureview;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PointF;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;

/**
 * Created by Administrator on 2017/6/15 0015.
 */

public class ApertureView extends View {
   

    private Path mPath;
    private Paint mPaint;
    private int mWidth,mHeight;
    private int mRadius;
    private int mSpace = 6;
    private PointF[] mPoints = new PointF[6];
    private float mMaxApert = 1;
    private float mMinApert = 0.2f;
    private float mCurrentApert = 0.5f;
    private Bitmap mBlade;
    private int mBladeColor;
    private int mCount = 6;
    private float COS_30 = (float) Math.cos(30.0f/180*Math.PI);
    public ApertureView(Context context) {
        this(context,null);
    }

    public ApertureView(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs,0);
    }

    public ApertureView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        this(context, attrs, defStyleAttr,0);
        this.setBackgroundColor(Color.GRAY);
    }

    public ApertureView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        mPaint = new Paint();
        mPaint.setStrokeWidth(2);
        mPath = new Path();
        mPaint.setAntiAlias(true);
        mPaint.setDither(true);
        mPaint.setFilterBitmap(true);
        mBladeColor = Color.argb(200,255,0,0);
        Log.i("zyq","COS_30="+COS_30);
        for(int i = 0;i<6;i++){
            mPoints[i]
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值