自定义view——仿支付宝咻一咻

news/2024/7/8 3:09:53

效果图

这里写图片描述

这里首先我们我们做一个波波,思路是这样:①设置圆圈的画笔②绘制图片到中心位置,并设置波的大小为图片宽度的一半③hanlder中设置波的半径不断变大,当半径大于画布宽度一半的时候设置半径为图片的宽度一半

public class XiuView2 extends View {
    private Paint paint;
    private Bitmap mBitmap;
    private int radius;
    private int bitmapWidth;
    private int bitmapHeight;
    private int width;
    public Handler handler = new Handler();
    Runnable runnable = new Runnable() {
        @Override
        public void run() {
            invalidate();
            if (radius >= width / 2) {
                radius = bitmapWidth/2;
            }else {
                radius+=3;
            }

            handler.postDelayed(runnable, 16);
        }

    };


    public XiuView2(Context context) {
        this(context, null);
    }

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

    public XiuView2(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        //圆圈的画笔
        paint = new Paint(Paint.ANTI_ALIAS_FLAG);//抗锯齿
        paint.setStyle(Paint.Style.FILL);//实心
        mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.pay);
        bitmapWidth = mBitmap.getWidth();//图片的宽
        bitmapHeight = mBitmap.getHeight();//图片的高
        radius = bitmapWidth / 2;//半径
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //获取画布的宽和高
        width = canvas.getWidth();
        int height = canvas.getHeight();
        //设置图片在中间位置显示
        float x = (width - bitmapWidth) / 2;
        float y = (height - bitmapHeight) / 2;
        paint.setColor(Color.parseColor("#155c7c"));
        //画多个圆

        canvas.drawCircle(width / 2, height / 2, radius, paint);
        canvas.drawBitmap(mBitmap, x, y, null);

    }

    //提供方法给外部去调用
    public void start() {
        handler.post(runnable);
    }
}

绘制多个圈:思路:基于上面的步骤,①我们可以将半径添加到list集合中,在Runnable中根据当前时间减去之前的时间,如果大于500则添加半径到集合中②遍历所有集合中数据,如果大于画布的宽度的一半,则移除③在画多个波波的时候设置透明度变化,这里我设置默认的透明度是177,根据计算alpha= 177 - 177 * ((radius - bitmapWidth / 2) / (width / 2 - bitmapWidth / 2));

public class XiuView extends View {
    private Paint paint;
    private Bitmap mBitmap;
    private int radius;
    private int bitmapWidth;
    private int bitmapHeight;
    private int width;
    private int alpha;
    public Handler handler = new Handler();
    private List<Integer> radiuss = new ArrayList<>();
    private long current = System.currentTimeMillis();
    Runnable runnable = new Runnable() {
        @Override
        public void run() {
            invalidate();
            //隔一段时间增加一个波
            if (System.currentTimeMillis() - current > 500) {
                radiuss.add(bitmapWidth / 2);
                current = System.currentTimeMillis();
            }
            //半径递增
            for (int i = 0; i < radiuss.size(); i++) {
                radiuss.set(i, radiuss.get(i) + 3);//半径增加
            }
            //移除超过屏幕的波
            Iterator<Integer> iterator = radiuss.iterator();
            if (iterator.hasNext()) {
                Integer next = iterator.next();
                if (next >= width / 2) {
                    if (radiuss.contains(next)) {
                        //最后进行移除
                        iterator.remove();
                    }
                }
            }

            handler.postDelayed(runnable, 16);
        }

    };


    public XiuView(Context context) {
        this(context, null);
    }

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

    public XiuView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        //圆圈的画笔
        paint = new Paint(Paint.ANTI_ALIAS_FLAG);//抗锯齿
        paint.setStyle(Paint.Style.FILL);//实心
        mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.pay);
        bitmapWidth = mBitmap.getWidth();//图片的宽
        bitmapHeight = mBitmap.getHeight();//图片的高
        radius = bitmapWidth / 2;//半径
        radiuss.add(radius);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //获取画布的宽和高
        width = canvas.getWidth();
        int height = canvas.getHeight();
        //设置图片在中间位置显示
        float x = (width - bitmapWidth) / 2;
        float y = (height - bitmapHeight) / 2;
        paint.setColor(Color.parseColor("#155c7c"));
        //画多个圆
        for (int i = 0; i < radiuss.size(); i++) {
            int radius = radiuss.get(i);
            //对波进行透明度变化
            alpha = 177 - 177 * ((radius - bitmapWidth / 2) / (width / 2 - bitmapWidth / 2));
            paint.setAlpha(alpha);
            canvas.drawCircle(width / 2, height / 2, radius, paint);
        }
        canvas.drawBitmap(mBitmap, x, y, null);

    }
    //提供方法给外部去调用
    public void start() {
        handler.post(runnable);
    }
}

http://www.niftyadmin.cn/n/3648890.html

相关文章

Android 5.0 权限管理导致的apk安装失败解决方案

在刚5.0出来的时候&#xff0c; 很多apk 在 5.0上会安装失败&#xff0c; 原因其实是&#xff0c; 安装的apk 中的 自定义权限 与 手机上面已经有的app 的自定义权限相同。 问题&#xff1a;当初有做 百度地图的同事就遇到了这个问题&#xff0c; app一直安装失败。需要去掉权限…

如何在CentOS 7上设置Eclipse Theia Cloud IDE平台

介绍 (Introduction) With developer tools moving to the cloud, adoption of cloud IDE (Integrated Development Environment) platforms is growing. Cloud IDEs are accessible from every type of modern device through web browsers, and they offer numerous advantag…

【Zookeeper】使用Curator操作Zookeeper

简介 Curator 是 Apache ZooKeeper 的Java客户端库。 Zookeeper现有常见的Java API如&#xff1a;原生JavaAPI、Curator、ZkClient等。 添加依赖 <dependency><groupId>org.apache.curator</groupId><artifactId>curator-framework</artifactId&…

写一套IOC注解框架

首先控件属性注入 //Target(ElementType.FIELD) 代表Annotion的值 FIELD属性 TYPE类上 METHOD方法 CONSTRUCTOR构造函数 Target(ElementType.FIELD) //Retention(RetentionPolicy.RUNTIME) 运行时生效 CLASS编译时生效 SOURCE源码资源 Retention(RetentionPolicy.RUNTIME) …

乐视揭秘Android5.0手机APP安装失败真相

Android5 0正在成为手机行业的新趋势&#xff0c;越来越多的手机厂商开始推出Android5 0系统的新一代手机。Android5.0正在成为手机行业的新趋势&#xff0c;越来越多的手机厂商开始推出Android5.0系统的新一代手机。乐视更是一口气推出三大旗舰手机&#xff0c;三款手机搭载的…

如何在CentOS 7上安装和使用TimescaleDB

The author selected the Computer History Museum to receive a donation as part of the Write for DOnations program. 作者选择“ 计算机历史博物馆”作为“ Write for DOnations”计划的一部分接受捐赠。 介绍 (Introduction) Many applications, such as monitoring sys…

android 解决APN问题

android4.0之后&#xff0c;需要系统签名&#xff0c;并把apk放在system/app下面 [html] view plaincopy <uses-permission android:name"android.permission.ACCESS_NETWORK_STATE" > </uses-permission> <uses-permission android:name&q…

react hooks使用_使用Hooks动态加载React组件

react hooks使用Dynamic sites need flexibility. Flexibility results in more code. More code means increased maintenance time. How can we keep our sites maintainable and fast? 动态站点需要灵活性。 灵活性导致更多代码。 更多代码意味着增加维护时间。 我们如何保…