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

效果展示

实现原理

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

实现步骤

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实现花瓣飘落效果的资料请关注我们其它相关文章!

(0)

相关推荐

  • Android实现三角形气泡效果方式汇总

    在开发过程中,我们可能会经常遇到这样的需求样式: 这张图是截取京东消息通知的弹出框,我们可以看到右上方有个三角形的气泡效果,这只是其中一种,三角形的方向还可以是上.下.左.右. 通过截图可以发现,气泡由正三角形和圆角长方形组成,于是可以通过组合来形成三角形气泡的效果,下面我们通过三种方式进行实现. 实现方式: 1.通过.9图进行实现: 2.通过shape方式实现: 3.通过自定义view的方式实现: 实现逻辑: 1.通过.9图进行实现 这种方式就不用说了吧,找你们UI小姐姐切一个.9图,使用即可

  • Android自定义圆形进度条效果

    本文实例为大家分享了Android自定义圆形进度条效果的具体代码,供大家参考,具体内容如下 1 控件 RoundProgress package listview.tianhetbm.p2p.ui; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import a

  • Android如何用自定义View实现雪花效果

    效果图 1.SnowView 类 package com.ilz.rocketapplication.handaccount.view; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.util.AttributeSet; import android.view.G

  • Android实现启动页倒计时效果

    今天介绍一个很简单的倒计时动画,仿酷狗音乐的启动页倒计时效果,也是大多数APP在用的一个动画,来看看效果图: 整体的思路就是用一个平滑的帧动画来画圆弧就行了. 这篇文章学到什么? 了解属性动画ValueAnimator的用法 了解动画属性插值Interpolator,让动画过度得更自然 如何画圆弧 开始准备 新建一个类继承TextView,因为中间还有跳过的文本,所以选择用TextView来画个动起来的背景图. /** * 倒计时文本 */ @SuppressLint("AppCompatCus

  • Android使用ViewPager实现启动引导页效果

    本文实例为大家分享了Android实现启动引导页效果的具体代码,供大家参考,具体内容如下 ViewPagerTwoActivity.java package cn.edu.zufe.app001; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.viewpager.widget.PagerAdapter; import androidx.vie

  • Android实现平滑翻动效果

    本文实例为大家分享了Android实现平滑翻动效果的具体代码,供大家参考,具体内容如下 效果 1.activity加implements implements GestureDetector.OnGestureListener 2. <ViewFlipper android:id="@+id/mars_bg" android:layout_width="match_parent" android:layout_height="match_parent

  • android仿微信表情雨下落效果的实现方法

    前言 众所周知,微信聊天中我们输入一些关键词会有表情雨下落,比如输入「生日快乐」「么么哒」会有相应的蛋糕.亲吻的表情雨下落,今天就来完成这个表情雨下落的效果.下面话不多说了,来一起看看详细的介绍吧 效果图 先来看下效果,真·狗头雨·落! 实现代码 确认表情的模型,定义属性 public class ItemEmoje { //坐标 public int x; public int y; // 横向偏移 public int offsetX; //纵向偏移 public int offsetY;

  • Android开发之多线程中实现利用自定义控件绘制小球并完成小球自动下落功能实例

    本文实例讲述了Android开发之多线程中实现利用自定义控件绘制小球并完成小球自动下落功能的方法.分享给大家供大家参考,具体如下: 1.布局界面 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_pare

  • android实现音乐跳动效果的示例代码

    效果图 实现 整体的流程图如下 上面主要步骤分为3个 1.计算宽度能放下多少列的音频块. 2.计算每一列中音频块的个数 3.绘制音频块 1.计算宽度能放下多少列的音频块. 设置音频块的宽度为danceWidth,音频块横向之间的间距为danceGap,那么可以算出能放的列数: /** * 先计算当前宽度能够放下多少个音频块 */ val widthNum = (getAvailableWith() / (danceGap + danceWidth)).toInt() /** * 获取可以用的宽度

  • Android实现仿微软系统加载动画效果

    效果图: 实现步骤: 初始化五个圆球分别设置中心点,方便画圆 利用ValueAnimator的值变化来获取旋转角度 onDraw来分别画每个圆 具体代码实现: 1.创建Circle对象 package com.sjl.keeplive.track; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.PointF; public class Circle { private

随机推荐