波浪球的效果一直都是想模仿的对象,在最近一段时间里模仿了这一界面,其实所用知识并不多。

1)、波浪的效果是利用三角函数来实现的,在自定义view中创建容量为width的数组,由y=Asin(Kx+T)+H得到每个x相对应的y值,然后存入数组里面。

2)、利用Android中Canvas提供的drawLine来从上部向下画线,每个像素上画完线之后就组成了图像。

3)、自定义view中的变量都与width建立了比例关系,可以任意大小,且效果一致。

4)、分别对y=Asin(Kx+T)+H中的T与H做valueAnimation的数字动画,就能实现波浪和上升的效果。

5)、利用Android中Paint的setXfermode来实现圆形效果。

6)、给外部提供了外部接口,可以对内部状态进行改变。

具体代码如下:

1 界面XML代码:

xmlns:tools="http://schemas.android.com/tools"

android:id="@+id/activity_wave_view"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:paddingBottom="@dimen/activity_vertical_margin"

android:paddingLeft="@dimen/activity_horizontal_margin"

android:paddingRight="@dimen/activity_horizontal_margin"

android:paddingTop="@dimen/activity_vertical_margin"

tools:context="com.example.app_switchbutton.WaveViewActivity">

android:id="@+id/begainButtton"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="开始"

android:layout_below="@+id/waveview"

android:layout_alignParentStart="true" />

android:layout_width="match_parent"

android:layout_height="match_parent"

android:id="@+id/waveview"

android:layout_alignParentTop="true"

android:layout_alignParentStart="true"

android:layout_marginStart="11dp" />

2、waveView的java代码:

package com.example.app_switchbutton;

import android.animation.ValueAnimator;

import android.content.Context;

import android.content.pm.ProviderInfo;

import android.graphics.Bitmap;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.Paint;

import android.graphics.PorterDuff;

import android.graphics.PorterDuffXfermode;

import android.util.AttributeSet;

import android.view.MotionEvent;

import android.view.View;

/**

* Created by 尽途 on 2017/4/30.

*/

public class waveView extends View {

private int widthSize;

private int heightSize;

private float[] mContentOneYs=null;

private float[] mContentTwoYs=null;

private float[] restoreOnes=null;

private float[] restoreTwos=null;

private float n=0.5f;

private int SWINGONE;

private int SWINGTWO;

private int OFFSETONE=0;

private int OFFSETTWO=0;

private Paint mPaint1;

private Paint mPaint2;

private Paint circlePaint;

private Canvas bitmapCanvas;

private Bitmap bitmap;

private float endValue;

public waveView(Context context){

super(context);

init();

}

public waveView(Context context, AttributeSet attributeSet){

super(context,attributeSet);

init();

}

private void init(){

mPaint1=new Paint();

mPaint1.setColor(Color.parseColor("#AB9DCF"));

mPaint1.setStrokeWidth(4);

mPaint1.setAlpha(240);

mPaint1.setStyle(Paint.Style.FILL);

mPaint1.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));

mPaint2=new Paint();

mPaint2.setColor(Color.parseColor("#A2D1F3"));

mPaint2.setStrokeWidth(4);

mPaint2.setAlpha(240);

mPaint2.setStyle(Paint.Style.FILL);

mPaint2.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));

circlePaint=new Paint();

circlePaint.setAntiAlias(true);

circlePaint.setColor(Color.GRAY);

// circlePaint.setAlpha(56);

}

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

widthSize=MeasureSpec.getSize(widthMeasureSpec);

heightSize=widthSize;

setMeasuredDimension(widthSize,heightSize);

bitmap=Bitmap.createBitmap(widthSize,heightSize, Bitmap.Config.ARGB_8888);//实现圆球效果

bitmapCanvas=new Canvas(bitmap);

SWINGONE=widthSize/20;

SWINGTWO=widthSize/10;

}

@Override

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

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

getPoints();

}

private void getPoints(){

mContentOneYs=new float[widthSize];

mContentTwoYs=new float[widthSize];

restoreOnes=new float[widthSize];

restoreTwos=new float[widthSize];

for (int i=0;i

mContentOneYs[i]=getposition1(i,SWINGONE,OFFSETONE,(int)(widthSize*n));

mContentTwoYs[i]=getposition2(i,SWINGTWO,OFFSETTWO,(int)(widthSize*n));

}

}

private float getposition1(int x,int swing,int offset,int baseHeight){

float cycle=(float)(2*Math.PI)/widthSize;

return (float)Math.sin(cycle*x+offset)*swing+baseHeight;

}

private float getposition2(int x,int swing,int offset,int baseHeight){

float cycle=(float)(2*Math.PI)/widthSize;

return (float)Math.cos(cycle*x+offset)*swing+baseHeight;

}

@Override

protected void onDraw(Canvas canvas) {

bitmapCanvas.drawCircle(widthSize/2,heightSize/2,widthSize/2,circlePaint);//实现圆球效果

canvas.save();

getPoints();

for (int i=0;i

final float x=i;

final float y1=mContentOneYs[i];

final float y2=mContentTwoYs[i];

bitmapCanvas.drawLine(x,y1,x,heightSize,mPaint2);//实现了线的绘制最终生成了图,在画的球上画的线

bitmapCanvas.drawLine(x,y2,x,heightSize,mPaint1);

}

canvas.drawBitmap(bitmap,0,0,null);//将球画在了主界面的View中。

}

@Override

public boolean onTouchEvent(MotionEvent event) {//按下就会产生动画效果

switch (event.getAction()){

case MotionEvent.ACTION_DOWN:

return true;

case MotionEvent.ACTION_MOVE:

return false;

case MotionEvent.ACTION_UP:

begainAnimation();

invalidate();

default:

break;

}

return super.onTouchEvent(event);

}

public void begainAnimation(){//所有动画的实现都在这个函数里面

final ValueAnimator valueAnimator=ValueAnimator.ofInt(0,20);

final ValueAnimator valueAnimator1=ValueAnimator.ofInt(0,20);

final ValueAnimator valueAnimator2=ValueAnimator.ofFloat(1,0.5f);

valueAnimator2.setDuration(5000);

valueAnimator.setDuration(5000);

valueAnimator1.setDuration(5000);

valueAnimator.setTarget(OFFSETTWO);

valueAnimator1.setTarget(OFFSETONE);

valueAnimator2.setTarget(n);

valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

@Override

public void onAnimationUpdate(ValueAnimator animation) {

OFFSETTWO=(int)valueAnimator.getAnimatedValue();

invalidate();

}

});

valueAnimator1.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

@Override

public void onAnimationUpdate(ValueAnimator animation) {

OFFSETONE=(int)valueAnimator1.getAnimatedValue();

invalidate();

}

});

valueAnimator2.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

@Override

public void onAnimationUpdate(ValueAnimator animation) {

n=(float)valueAnimator2.getAnimatedValue();

}

});

valueAnimator.start();

valueAnimator1.start();

valueAnimator2.start();

}

public void changgeState(float endValue){//给外部的一个接口

this.endValue=1-endValue;

begainAnimation();

}

}

3、waveActivity的java代码:

package com.example.app_switchbutton;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import android.view.View;

import android.widget.Button;

public class WaveViewActivity extends AppCompatActivity {

private Button begainButton;

private waveView waveview;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_wave_view);

waveview=(waveView)findViewById(R.id.waveview);

begainButton=(Button)findViewById(R.id.begainButtton);

begainButton.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

waveview.begainAnimation();

}

});

}

}

在此也多些网上的老前辈的学习代码。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

android仿百度外卖波浪_Android实现波浪球效果相关推荐

  1. iOS 仿百度外卖,饿了么-点餐效果(加入购物车效果)

    今天带来的是仿百度外卖,饿了么-点餐效果既物品加入购物车时的动画效果,这里用的Masonry布局,下滑的效果主要是通过UIBezierPath CAKeyframeAnimation CABasicA ...

  2. android仿百度外卖波浪_头像随波浪漂浮效果—仿Android百度外卖

    前几天看到有iOS仿百度外卖的个人页,所以就随手撸了个Android.效果图如下: demo.gif 源码 改造轮子 轮子就不重复造了,github上已经有实现波浪的效果WaveView,WaveVi ...

  3. android仿百度外卖波浪_iOS实现百度外卖头像波浪的效果

    效果演示 百度外卖 波浪效果图: 你需要知道的 CADisplayLink 简单的说就是一定时器,其根本利用刷帧和屏幕频率一样来重绘渲染页面. 其创建方式: CADisplayLink *timer ...

  4. 仿百度外卖的酷炫水波纹效果

    2019独角兽企业重金招聘Python工程师标准>>> 我们先来看下这个自定义的View的代码是如何实现的. 我们一步步来分析.首先我们要自定义一个View. 自定义View流程 我 ...

  5. CSS3高仿百度外卖头像波浪效果

    好Q啼的头像,说好的波浪捏,浪到哪里去了,别急,静静欣赏动态效果:链接:https://pan.baidu.com/s/1gfAM3y7 密码:wxn6 技术: 1.css water wave 实现 ...

  6. android 仿饿了么地图,iOS Andriod百度地图仿百度外卖 饿了么 选择我的地址 POI检索...

    title: iOS Andriod百度地图仿百度外卖 饿了么 选择我的地址 POI检索 date: 2015-09-19 21:06:26 tags: 百度外卖选择送货地址:饿了么选择送货地址: 第 ...

  7. iOS 仿百度外卖,饿了么-商品列表页

    今天带来的是仿百度外卖的商品列表页 下载地址 先看下效果图 这个主要是通过 - (void)selectRowAtIndexPath:(nullableNSIndexPath *)indexPath ...

  8. Android仿拼多多实现图片叠加部分覆盖效果

    Android仿拼多多实现图片叠加部分覆盖效果 需要实现的效果如下: 代码部分: AppIconStackView: public class AppIconStackView extends Vie ...

  9. Android:高仿百度外卖、美团、淘点点二级联动效果!

    美团,百度外卖的左右二级联动效果如下: 具体的效果建议打开手机软件玩玩. 分析 首先我们一起分析一下这个界面给我们要怎么去实现. 1.最上面的ToolBar不用多解释,比较简单. 2.下面三个界面切换 ...

最新文章

  1. asp.net 网页做一个浮动层_你们要的HTML、CSS布局技巧:如何规范搭建网页架构?
  2. vue 2.0 filter html,vue.filter使用方法是什么
  3. (转载)计算机科学中最重要的32个算法
  4. html中如何屏蔽一段代码,html中如何使用python屏蔽一些基本功能(示例代码)
  5. Markdown基本语法【转】
  6. 使用SVN的hook将更新内容同步到测试环境
  7. Java进阶:CAS原理详解
  8. Ocr技术 识别高级验证码
  9. 五大地形等高线特征_高考复习地形特征描述专题
  10. 编译通过,但在运行时报Resolution of the dependency failed
  11. 洛谷P3155:叶子的染色(树形dp)
  12. android studio 集成 第三方sdk,Android FrameWork集成第三方SDK的jar包和so庫
  13. 19 FI配置-财务会计-定义销售/采购税代码
  14. c语言表达式求值的空间复杂度,373-时间复杂度(表达式求值)
  15. 自用shell命令搜集
  16. MATLAB 官方文档
  17. Android中的英文翻译
  18. matlab画任意正多边形,MATLAB——patch绘制多边形
  19. excel求四分位数(QUARTILE 函数)
  20. Blast中文手册(5)

热门文章

  1. 有乳腺结节严不严重 乳房结节1cm要手术吗
  2. java本地定时缓存,单例可执行外部接口
  3. 嵌入式面试题整理(一)
  4. 天然气分配系统市场深度研究分析报告
  5. 机器学习_深度学习毕设题目汇总——目标检测B
  6. 金融数据分析用哪些分析软件Python,R还是SQL?
  7. 查看mysql数据库引擎
  8. Gitblit搭建及Git协作开发流程
  9. SMC 常规型压力传感器/开关(真空/正压)使用说明书 Z/ISE30A
  10. qt 从零开始搭建插件框架