在Android开发中使用View制作一个引导动画

发布时间:2020-11-20 16:46:16

来源:亿速云

阅读:98

作者:Leah

这篇文章将为大家详细讲解有关在Android开发中使用View制作一个引导动画,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

一、实现效果图

关于贝塞尔曲线

二、实现代码

1.自定义view

package com.czhappy.showintroduce.view;

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.util.AttributeSet;

import android.view.View;

import android.widget.RelativeLayout;

/**

* Description: 水波纹动画引导view

* User: chenzheng

* Date: 2017/1/14 0014

* Time: 18:01

*/

public class RippleIntroView extends RelativeLayout implements Runnable {

private int mMaxRadius = 70;

private int mInterval = 20;

private int count = 0;

private Bitmap mCacheBitmap;

private Paint mRipplePaint;

private Paint mCirclePaint;

private Path mArcPath;

public RippleIntroView(Context context) {

this(context, null);

}

public RippleIntroView(Context context, AttributeSet attrs) {

this(context, attrs, 0);

}

public RippleIntroView(Context context, AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

init();

}

private void init() {

mRipplePaint = new Paint();

mRipplePaint.setAntiAlias(true);

mRipplePaint.setStyle(Paint.Style.STROKE);

mRipplePaint.setColor(Color.WHITE);

mRipplePaint.setStrokeWidth(2.f);

mCirclePaint = new Paint();

mCirclePaint.setAntiAlias(true);

mCirclePaint.setStyle(Paint.Style.FILL);

mCirclePaint.setColor(Color.WHITE);

mArcPath = new Path();

}

/**

* view大小变化时系统调用

* @param w

* @param h

* @param oldw

* @param oldh

*/

@Override

protected void onSizeChanged(int w, int h, int oldw, int oldh) {

super.onSizeChanged(w, h, oldw, oldh);

if (mCacheBitmap != null) {

mCacheBitmap.recycle();

mCacheBitmap = null;

}

}

@Override

protected void onDraw(Canvas canvas) {

//获取加号图片view

View mPlusChild = getChildAt(0);

//获取提示图片view

View mRefsChild = getChildAt(1);

if (mPlusChild == null || mRefsChild == null) return;

//获取加号图片大小

final int pw = mPlusChild.getWidth();

final int ph = mPlusChild.getHeight();

//获取提示图片大小

final int fw = mRefsChild.getWidth();

final int fh = mRefsChild.getHeight();

if (pw == 0 || ph == 0) return;

//加号图片中心点坐标

final float px = mPlusChild.getX() + pw / 2;

final float py = mPlusChild.getY() + ph / 2;

//提示图片左上角坐标

final float fx = mRefsChild.getX();

final float fy = mRefsChild.getY();

final int rw = pw / 2;

final int rh = ph / 2;

if (mCacheBitmap == null) {

mCacheBitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);

Canvas cv = new Canvas(mCacheBitmap);

super.onDraw(cv);

//清空所有已经画过的path至原始状态

mArcPath.reset();

//起始轮廓点移至x,y坐标点,即加号图片正下方再往下20位置

mArcPath.moveTo(px, py + rh + mInterval);

//设置二次贝塞尔,实现平滑曲线,前两个参数为操作点坐标,后两个参数为结束点坐标

mArcPath.quadTo(px, fy - mInterval, fx + fw * 0.618f, fy - mInterval);

//0~255,数值越小越透明

mRipplePaint.setAlpha(255);

cv.drawPath(mArcPath, mRipplePaint);

//绘制半径为6的实心圆点

cv.drawCircle(px, py + rh + mInterval, 6, mCirclePaint);

}

//绘制背景图片

canvas.drawBitmap(mCacheBitmap, 0, 0, mCirclePaint);

//保存画布当前的状态

int save = canvas.save();

for (int step = count; step <= mMaxRadius; step += mInterval) {

//step越大越靠外就越透明

mRipplePaint.setAlpha(255 * (mMaxRadius - step) / mMaxRadius);

canvas.drawCircle(px, py, (float) (rw + step), mRipplePaint);

}

//恢复Canvas的状态

canvas.restoreToCount(save);

//延迟80毫秒后开始运行

postDelayed(this, 80);

}

@Override

public void run() {

//把run对象的引用从队列里拿出来,这样,他就不会执行了,但 run 没有销毁

removeCallbacks(this);

count += 2;

count %= mInterval;

invalidate();//重绘

}

/**

* 销毁view时调用,收尾工作

*/

@Override

protected void onDetachedFromWindow() {

super.onDetachedFromWindow();

if (mCacheBitmap != null) {

mCacheBitmap.recycle();

mCacheBitmap = null;

}

}

}

2.MainActivity.java

package com.czhappy.showintroduce.activity;

import android.os.Bundle;

import android.support.v7.app.AppCompatActivity;

import android.view.View;

import android.view.ViewGroup;

import com.czhappy.showintroduce.R;

public class MainActivity extends AppCompatActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

View view = findViewById(R.id.layout_ripple);

view.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

((ViewGroup) v.getParent()).removeView(v);

}

});

}

}

3.activity_main.xml

android:layout_width="match_parent"

android:layout_height="match_parent">

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="Hello World!" />

android:id="@+id/layout_ripple"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:clickable="true"

android:fitsSystemWindows="true"

android:background="#AA000000">

android:id="@+id/iv_plus"

android:layout_marginTop="36dp"

android:src="@mipmap/ic_add"

android:layout_alignParentRight="true"

android:layout_marginRight="6dp"

android:layout_width="wrap_content"

android:layout_height="wrap_content"/>

android:src="@mipmap/tips_subscribe"

android:id="@+id/tv_title"

android:layout_below="@id/iv_plus"

android:layout_marginTop="50dp"

android:layout_alignParentRight="true"

android:layout_marginRight="40dp"

android:layout_width="wrap_content"

android:layout_height="wrap_content"/>

关于在Android开发中使用View制作一个引导动画就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

android动画view上移,在Android开发中使用View制作一个引导动画相关推荐

  1. android打地鼠设计报告,android开发中利用handler制作一个打地鼠小游戏

    android开发中利用handler制作一个打地鼠小游戏 发布时间:2020-11-25 15:21:11 来源:亿速云 阅读:136 作者:Leah 这期内容当中小编将会给大家带来有关androi ...

  2. android listview下拉动画效果,Android开发中利用ListView实现一个渐变式的下拉刷新动画...

    Android开发中利用ListView实现一个渐变式的下拉刷新动画 发布时间:2020-11-23 16:50:31 来源:亿速云 阅读:80 作者:Leah 本篇文章给大家分享的是有关Androi ...

  3. Android事件分发机制在实战开发中的应用之一

    学习的最终目标就是要学以致用,本文所分享的案例都是自己在公司实战开发过程中的真实案例,现在把它分享出来,希望对初学者有所帮助 版权声明:本文来自门心叼龙的博客,属于原创内容,转载请注明出处:https ...

  4. Android事件分发机制在实战开发中的应用之二

    学习的最终目标就是要学以致用,本文所分享的案例都是自己在公司实战开发过程中的真实案例,现在把它分享出来,希望对初学者有所帮助 版权声明:本文来自门心叼龙的博客,属于原创内容,转载请注明出处:https ...

  5. IOS 开发中 Whose view is not in the window hierarchy 错误的解决办法

    在 IOS 开发当中经常碰到 whose view is not in the window hierarchy 的错误,该错误简单的说,是由于 "ViewController" ...

  6. iphone iPhone开发中如何将制作图片放大缩小代码实现案例

    1:原文摘自:http://mobile.51cto.com/iphone-285108.htm iPhone开发中如何将制作图片放大缩小案例是本文要介绍的内容,主要是来学习iphone开发中动画的制 ...

  7. Cinemachine教程 | Unity中如何快速制作相机切换动画?

    摘要:使用Cinemachine可以快速制作相机切换动画,来看看我是怎么做的吧. 洪流学堂,让你快人几步.你好,我是跟着大智学Unity的萌新,我叫小新,这是我本周的学习总结报告哦. 好久不见.我最近 ...

  8. 【web前端特效源码】使用HTML5+CSS3+JavaScript制作一个电风扇动画效果~适合初学者~超简单~ |前端开发|IT软件

    b站视频演示效果: [web前端特效源码]使用HTML5+CSS3+JavaScript制作一个电风扇动画效果~适合初学者~超简单~ |前端开发|IT软件 效果图: 完整代码: <!DOCTYP ...

  9. ​Unity 游戏开发技巧集锦之制作一个望远镜与查看器摄像机

    ​Unity 游戏开发技巧集锦之制作一个望远镜与查看器摄像机 Unity中制作一个望远镜 本节制作的望远镜,在鼠标左键按下时,看到的视图会变大:当不再按下的时候,会慢慢缩小成原来的视图.游戏中时常出现 ...

最新文章

  1. Android 录制视频
  2. [Oracle]理解undo表空间
  3. sourceInsight4 破解笔记(完美破解)
  4. 我的Windows Vista™也装好了...
  5. QT实现音乐的大小可视化为动画条
  6. List集合_介绍常用方法
  7. shell timeout
  8. java中函数过载,Java继承中成员方法的overload(重载/过载)
  9. #ifndef、#def、#endif等宏是什么意思
  10. ARM 指令集版本和ARM 版本z
  11. UVA10192 Vacation【LCS+DP+记忆化递归】
  12. vue—点击换一批就更换一批内容_Vue.js点击切换按钮改变内容的实例讲解
  13. 离职通知邮件主题写什么好_离职邮件主题怎么写
  14. python统计字符串个数_python实现字符串中字符分类及个数统计
  15. win7网络改局域网计算机名,教你win7局域网设置方法
  16. jsoncpp操作类
  17. 我国首个5G地铁站开通:TCL集团重组方案通过;苹果2019新品图泄露|雷锋早报...
  18. 3D Touch 之死
  19. 手机怎么设置腾达路由器后显示远端服务器,怎么用手机设置腾达(Tenda)路由器wifi密码?...
  20. 芬美意2020财年集团收入38.78亿瑞士法郎,增长2.8%

热门文章

  1. 图片人脸检测——OpenCV版(二)
  2. 转:RMAN 备份与恢复 实例
  3. js处理16进制hex转str出现的中文乱码问题
  4. ssh 脚本 空格字符转换
  5. linux vnc 改端口号,基于Linux中vnc配置端口号的修改方法
  6. java mvc中重复提交_SpringMVC之——防止重复提交表单的方法(一)
  7. concat合并的数组会有顺序么_超全的JS常用数组方法整理
  8. dw新建php文件自动生成html,dw如何新建css规则
  9. arduino 土壤温湿度传感器_【雕爷学编程】Arduino动手做(70)---土壤湿度传感器...
  10. Win11怎么设置提高电脑游戏性能