返回顶部
首页 > 资讯 > 移动开发 >Android实现花瓣飘落效果的步骤
  • 167
分享到

Android实现花瓣飘落效果的步骤

2024-04-02 19:04:59 167人浏览 安东尼
摘要

目录效果展示实现原理实现步骤完整代码展示效果展示 实现原理 首先需要生成绘制小花的坐标点,坐标点的横坐标是根据控件的宽度随机生成的,而纵坐标则设置为小花图片高度的负值(

效果展示

实现原理

  • 首先需要生成绘制小花的坐标点,坐标点的横坐标是根据控件的宽度随机生成的,而纵坐标则设置为小花图片高度的负值(这样可以实现小花从屏幕外进入)。
  • 将这些点存储到集合当中。
  • 遍历集合根据点的位置绘制小花
  • 绘制完后不断增加各个点的纵坐标

实现步骤

1.定义变量将变量初始化


    private SurfaceHolder mHolder;
    private boolean mFlag = true;//绘制小花线程的开关标志
    private ArrayList<PointF> mFlowers;//小花点的坐标集合
    private Random mRandom;//负责随机数生成
    private Bitmap mBitmap;//小花的图案

    public FlowerView(Context context) {
        super(context);
        init();
    }

    public FlowerView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public FlowerView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }
    private void init(){
        mHolder = getHolder();
        mHolder.addCallback(this);
        //设置背景透明
        this.setZOrderOnTop(true);
        mHolder.setFORMat(PixelFormat.TRANSLUCENT);

        mFlowers = new ArrayList<>();
        mRandom = new Random();

        mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_hua);

    }

2.实现添加花朵坐标点的方法



    private void addFlower(){
        PointF point = new PointF();
        point.x=mRandom.nextInt(getWidth());//根据控件宽度随机生成X轴坐标
        point.y=-mBitmap.getHeight();//纵坐标设置为小花图像的负值(产生从屏幕外进入的效果)
        mFlowers.add(point);//将坐标点添加进集合
    }

3.实现SurfaceHolder.Callback及Runnable接口


public class FlowerView extends SurfaceView implements SurfaceHolder.Callback,Runnable

4.在run方法中实现绘制逻辑


 @Override
    public void run() {
        while (mFlag){
            try {
                Thread.sleep(80);//控制小花的下落速度
                canvas canvas = mHolder.lockCanvas();
                PointF pointF = null;
                //清屏操作(否则会残留一些无用图像)
                if(canvas!=null){
                    canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
                }else {
                    continue;
                }
                for(PointF point: mFlowers){
                    pointF = point;
                    canvas.drawBitmap(mBitmap,pointF.x,pointF.y,null);
                    int i = mRandom.nextInt(getHeight()/50)+getHeight()/50;//修改雨滴线的纵坐标,使其看起来在下雨
                    pointF.y=pointF.y+i;
                }
                mHolder.unlockCanvasAndPost(canvas);
                addFlower();
                //当绘制点的纵坐标大于控件高度时,将该点移除
                if(mFlowers.size()>0&&pointF!=null&&pointF.y>=getHeight()){
                    mFlowers.remove(pointF);
                }

            }catch (Exception e){}
        }
    }

5.在SurfaceHolder.Callback的回调方法中开启绘制线程


 @Override
    public void surfaceCreated(SurfaceHolder holder) {
        mFlag = true;//surface创建时将线程开关打开
        new Thread(this).start();//开启线程绘制
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        mFlowers.clear();//当控件发生改变时清除之前的绘制点
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        mFlag = false;//当surface销毁时关掉绘制线程
    }

完整代码展示


public class FlowerView extends SurfaceView implements SurfaceHolder.Callback,Runnable{
    private SurfaceHolder mHolder;
    private boolean mFlag = true;//绘制小花线程的开关标志
    private ArrayList<PointF> mFlowers;//小花点的坐标集合
    private Random mRandom;//负责随机数生成
    private Bitmap mBitmap;//小花的图案

    public FlowerView(Context context) {
        super(context);
        init();
    }

    public FlowerView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public FlowerView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }
    private void init(){
        mHolder = getHolder();
        mHolder.addCallback(this);
        //设置背景透明
        this.setZOrderOnTop(true);
        mHolder.setFormat(PixelFormat.TRANSLUCENT);

        mFlowers = new ArrayList<>();
        mRandom = new Random();

        mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_hua);

    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        mFlag = true;
        new Thread(this).start();
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        mFlowers.clear();
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        mFlag = false;
    }

    @Override
    public void run() {
        while (mFlag){
            try {
                Thread.sleep(80);
                Canvas canvas = mHolder.lockCanvas();
                PointF pointF = null;
                //清屏操作
                if(canvas!=null){
                    canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
                }else {
                    continue;
                }
                for(PointF point: mFlowers){
                    pointF = point;
                    canvas.drawBitmap(mBitmap,pointF.x,pointF.y,null);
                    int i = mRandom.nextInt(getHeight()/50)+getHeight()/50;//修改雨滴线的纵坐标,使其看起来在下雨
                    pointF.y=pointF.y+i;
                }
                mHolder.unlockCanvasAndPost(canvas);
                addFlower();
                if(mFlowers.size()>0&&pointF!=null&&pointF.y>=getHeight()){
                    mFlowers.remove(pointF);
                }

            }catch (Exception e){}
        }
    }

    
    private void addFlower(){
        PointF point = new PointF();
        point.x=mRandom.nextInt(getWidth());
        point.y=-mBitmap.getHeight();
        mFlowers.add(point);
    }
}

以上就是Android实现花瓣飘落效果的步骤的详细内容,更多关于Android实现花瓣飘落效果的资料请关注编程网其它相关文章!

--结束END--

本文标题: Android实现花瓣飘落效果的步骤

本文链接: https://lsjlt.com/news/124720.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Android实现花瓣飘落效果的步骤
    目录效果展示实现原理实现步骤完整代码展示效果展示 实现原理 首先需要生成绘制小花的坐标点,坐标点的横坐标是根据控件的宽度随机生成的,而纵坐标则设置为小花图片高度的负值(...
    99+
    2024-04-02
  • 怎么在Android中实现一个花瓣飘落效果
    这篇文章给大家介绍怎么在Android中实现一个花瓣飘落效果,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Android是什么Android是一种基于Linux内核的自由及开放源代码的操作系统,主要使用于移动设备,如智...
    99+
    2023-06-14
  • JavaScript实现雪花飘落效果特效
    没有雪的冬天失去了冬天的美景,不见了千里冰封,万里雪飘的北国之美,诗人无从写雪,画家画不出雪景,摄影师拍不到冬天的美丽。雪,是冬天的灵魂,为大地铺好背景,之后发生的都如梦似幻,就像童...
    99+
    2023-01-01
    js雪花特效 雪花特效
  • JavaScript如何实现雪花飘落效果
    本篇内容主要讲解“JavaScript如何实现雪花飘落效果”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JavaScript如何实现雪花飘落效果”吧!效果图:代码:!DOCTYPE h...
    99+
    2023-07-04
  • 怎么用CSS3实现雪花飘落的效果
    这篇文章将为大家详细讲解有关怎么用CSS3实现雪花飘落的效果,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。   我们可以根据自己想要的动画效果来设置动画,比如在本例中:...
    99+
    2024-04-02
  • JS和JQuery如何实现雪花飘落效果
    这篇文章主要为大家展示了“JS和JQuery如何实现雪花飘落效果”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JS和JQuery如何实现雪花飘落效果”这篇文章吧...
    99+
    2024-04-02
  • jQuery实现雪花飘落效果的示例分析
    这篇文章主要介绍jQuery实现雪花飘落效果的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!示例:<!DOCTYPE html> <html>...
    99+
    2024-04-02
  • CSS3如何实现雪花飘落特效
    这篇文章主要介绍“CSS3如何实现雪花飘落特效”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“CSS3如何实现雪花飘落特效”文章能帮助大家解决问题。在CSS3中我们可以使用animation属性来创建...
    99+
    2023-07-04
  • HTML5中canvas如何实现雪花飘落特效
    这篇文章给大家分享的是有关HTML5中canvas如何实现雪花飘落特效的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。最终效果图如下: 图1一、需求分析圆形雪花本示例中雪花形状使用圆形雪花数量固定根据图1...
    99+
    2023-06-09
  • JavaScript实现动态网页飘落的雪花
    本文实例为大家分享了JavaScript实现动态网页飘落雪花的具体代码,供大家参考,具体内容如下 设计思路: 1.定义一定数量的雪花层,每层包含一个雪花; 2.雪花水平方向左右摇摆则...
    99+
    2024-04-02
  • HTML5怎么实现树叶飘落动画效果
    这篇“HTML5怎么实现树叶飘落动画效果”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“HT...
    99+
    2024-04-02
  • CSS3中怎么利用animation属性实现雪花飘落特效
    这篇文章给大家介绍CSS3中怎么利用animation属性实现雪花飘落特效,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。在CSS3中我们可以使用animation属性来创建复杂的动画效...
    99+
    2024-04-02
  • JavaScript如何实现动态网页飘落的雪花
    这篇文章主要介绍了JavaScript如何实现动态网页飘落的雪花的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇JavaScript如何实现动态网页飘落的雪花文章都会有所收获,下面我们一起来看看吧。设计思路:定义...
    99+
    2023-07-02
  • Matlab如何实现有雪花飘落的圣诞树
    本篇内容主要讲解“Matlab如何实现有雪花飘落的圣诞树”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Matlab如何实现有雪花飘落的圣诞树”吧!圣诞树及礼物绘制% 生成树本体曲面tr...
    99+
    2023-07-04
  • Fiori里花瓣的动画效果实现原理是什么
    本篇文章为大家展示了Fiori里花瓣的动画效果实现原理是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Fiori里的busy dialog有两种表现形式,一种是下图里的花朵形状,由5个不断旋转的...
    99+
    2023-06-04
  • html5中怎么利用canvas实现3d雪花飘舞效果
    html5中怎么利用canvas实现3d雪花飘舞效果,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。var SCREEN_WID...
    99+
    2024-04-02
  • Vue实现步骤条效果
    本文实例为大家分享了Vue实现步骤条效果的具体代码,供大家参考,具体内容如下 步骤总数和初始选择步骤 均可自定义设置,每个步骤title和description也均可自定义设置传入 ...
    99+
    2024-04-02
  • Android自定义View实现飘动的叶子效果(三)
    上一篇对自定义View及一些方法有所了解,下面做一个简单的叶子飘动的例子 主要技术点 1、添加背景图片canvas.drawBitmap() 2、Matrix动画类 3、Ma...
    99+
    2022-06-06
    view Android
  • Android自定义View实现叶子飘动旋转效果(四)
    上一篇实现了叶子飘动功能,《Android自定义叶子飘动》 现在实现旋转效果 要实现这个效果,要在之前的功能上添加2个功能 1、通过matrix.postTranslate(...
    99+
    2022-06-06
    view Android
  • Android Flutter实现自由落体弹跳动画效果
    目录粒子运动概念如何保持持续运动 创建粒子对象创建粒子控制器初始化粒子创建画板多粒子实现八大行星加速度自由落体弹跳总结粒子运动概念 粒子运动是将对象按照一定物理公式进行的自...
    99+
    2022-11-13
    Android Flutter自由落体弹跳动画 Flutte 弹跳动画 Flutter 动画
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作