一个动态波浪纹Android界面

技术一个动态波浪纹Android界面 一个动态波浪纹Android界面IndexActivity.javapackage com.example.rubikrobot;import androidx.a

一个动态波浪纹机器人界面

IndexActivity.java

包裹。com。例子。rubikrobot

导入androidx。app compat。app。AppCompactivity

导入安卓。动画。动画师;

导入安卓。动画。动画师集;

导入安卓。动画。objectanimator

导入安卓。内容。意图;

导入安卓。操作系统。捆绑;

导入安卓。操作系统。处理程序;

导入安卓。操作系统。活套;

导入安卓。查看。查看;

导入安卓。查看。窗户;

导入安卓。查看。动画。加速减速插值器;

导入安卓。小部件。按钮;

导入安卓。小部件。imageview

导入Java。乌提尔。ArrayList

公共类索引活动扩展了AppCompatActivity {

私人按钮按钮;

@覆盖

受保护的无效创建(捆绑保存实例){ 0

超级棒。oncreate(savedInstanceState);

请求窗口功能(窗口。特征_编号_标题);

setContentView(r . layout。activity _ index);

final RippleBackground RippleBackground=findweid(r . id。内容);

最终处理程序=新处理程序(looper。my loop er());

//Founddevice=(ImageView)FindeViewByID(r . id。found device);

button=findwiewbyid(r . id。中心图像);

ripplebackground。startrippleanimation();

意向意向=新意向();

button.setOnClickListener(新视图OnClickListener(){ 0

@覆盖

公共空间点击(视图v){ 0

意图。setclass(indexactivity。这个,主要活动。类);

startActivity(意图);

}

});

}

}

RippleBackground.java

包裹。com。例子。rubikrobot

导入安卓。动画。动画师;

导入安卓。动画。动画师集;

导入安卓。动画。objectanimator

导入安卓。内容。语境;

导入安卓。内容。RES . typedarray

导入安卓。图形。帆布;

导入安卓。图形。油漆;

导入安卓。乌提尔。属性集;

导入安卓。查看。查看;

导入安卓。查看。动画。加速减速插值器;

导入安卓。小部件。相对布局;

导入Java。乌提尔。ArrayList

公共类RippleBackground扩展了相对视频

私有静态最终int DEFAULT _ RIPPLE _ COUNT=6;

私有静态最终int DEFAULT _ DURATION _ TIME=3000

私有静态最终浮点DEFAULT _ SCALE=6.0f

私人员工

tic final int DEFAULT_FILL_TYPE=0;
private int rippleColor;
private float rippleStrokeWidth;
private float rippleRadius;
private int rippleDurationTime;
private int rippleAmount;
private int rippleDelay;
private float rippleScale;
private int rippleType;
private Paint paint;
private boolean animationRunning=false;
private AnimatorSet animatorSet;
private ArrayListAnimator animatorList;
private LayoutParams rippleParams;
private ArrayListRippleView rippleViewList=new ArrayListRippleView();
public RippleBackground(Context context) {
super(context);
}
public RippleBackground(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs);
}
public RippleBackground(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context, attrs);
}
private void init(final Context context, final AttributeSet attrs) {
if (isInEditMode())
return;
if (null == attrs) {
throw new IllegalArgumentException("Attributes should be provided to this view,");
}
final TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.RippleBackground);
rippleColor=typedArray.getColor(R.styleable.RippleBackground_rb_color, getResources().getColor(R.color.rippelColor));
rippleStrokeWidth=typedArray.getDimension(R.styleable.RippleBackground_rb_strokeWidth, getResources().getDimension(R.dimen.rippleStrokeWidth));
rippleRadius=typedArray.getDimension(R.styleable.RippleBackground_rb_radius,getResources().getDimension(R.dimen.rippleRadius));
rippleDurationTime=typedArray.getInt(R.styleable.RippleBackground_rb_duration,DEFAULT_DURATION_TIME);
rippleAmount=typedArray.getInt(R.styleable.RippleBackground_rb_rippleAmount,DEFAULT_RIPPLE_COUNT);
rippleScale=typedArray.getFloat(R.styleable.RippleBackground_rb_scale,DEFAULT_SCALE);
rippleType=typedArray.getInt(R.styleable.RippleBackground_rb_type,DEFAULT_FILL_TYPE);
typedArray.recycle();
rippleDelay=rippleDurationTime/rippleAmount;
paint = new Paint();
paint.setAntiAlias(true);
if(rippleType==DEFAULT_FILL_TYPE){
rippleStrokeWidth=0;
paint.setStyle(Paint.Style.FILL);
}else
paint.setStyle(Paint.Style.STROKE);
paint.setColor(rippleColor);
rippleParams=new LayoutParams((int)(2*(rippleRadius+rippleStrokeWidth)),(int)(2*(rippleRadius+rippleStrokeWidth)));
rippleParams.addRule(CENTER_IN_PARENT, TRUE);
animatorSet = new AnimatorSet();
animatorSet.setInterpolator(new AccelerateDecelerateInterpolator());
animatorList=new ArrayListAnimator();
for(int i=0;irippleAmount;i++){
RippleView rippleView=new RippleView(getContext());
addView(rippleView,rippleParams);
rippleViewList.add(rippleView);
final ObjectAnimator scaleXAnimator = ObjectAnimator.ofFloat(rippleView, "ScaleX", 1.0f, rippleScale);
scaleXAnimator.setRepeatCount(ObjectAnimator.INFINITE);
scaleXAnimator.setRepeatMode(ObjectAnimator.RESTART);
scaleXAnimator.setStartDelay(i * rippleDelay);
scaleXAnimator.setDuration(rippleDurationTime);
animatorList.add(scaleXAnimator);
final ObjectAnimator scaleYAnimator = ObjectAnimator.ofFloat(rippleView, "ScaleY", 1.0f, rippleScale);
scaleYAnimator.setRepeatCount(ObjectAnimator.INFINITE);
scaleYAnimator.setRepeatMode(ObjectAnimator.RESTART);
scaleYAnimator.setStartDelay(i * rippleDelay);
scaleYAnimator.setDuration(rippleDurationTime);
animatorList.add(scaleYAnimator);
final ObjectAnimator alphaAnimator = ObjectAnimator.ofFloat(rippleView, "Alpha", 1.0f, 0f);
alphaAnimator.setRepeatCount(ObjectAnimator.INFINITE);
alphaAnimator.setRepeatMode(ObjectAnimator.RESTART);
alphaAnimator.setStartDelay(i * rippleDelay);
alphaAnimator.setDuration(rippleDurationTime);
animatorList.add(alphaAnimator);
}
animatorSet.playTogether(animatorList);
}
private class RippleView extends View{
public RippleView(Context context) {
super(context);
this.setVisibility(View.INVISIBLE);
}
@Override
protected void onDraw(Canvas canvas) {
int radius=(Math.min(getWidth(),getHeight()))/2;
canvas.drawCircle(radius,radius,radius-rippleStrokeWidth,paint);
}
}
public void startRippleAnimation(){
if(!isRippleAnimationRunning()){
for(RippleView rippleView:rippleViewList){
rippleView.setVisibility(VISIBLE);
}
animatorSet.start();
animationRunning=true;
}
}
public void stopRippleAnimation(){
if(isRippleAnimationRunning()){
animatorSet.end();
animationRunning=false;
}
}
public boolean isRippleAnimationRunning(){
return animationRunning;
}
}

layout

xml version="1.0" encoding="utf-8"
com.example.rubikrobot.RippleBackground
    xmlns:andro
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#A2DAEC"
    android:
    app:rb_color="#0099CC"
    app:rb_radius="32dp"
    app:rb_rippleAmount="6"
    app:rb_duration="3000"
    app:rb_scale="6"
    Button
        android:layout_width="64dp"
        android:layout_height="64dp"
        android:layout_centerInParent="true"
        android:
        android:text="启动"
        android:textColor="@color/white"
        android:background="@drawable/ic_blue"
        /
/com.example.rubikrobot.RippleBackground

效果图:

这是三个主要文件,剩下的没有展示。

链接:Github

参考文档以及链接均来自于:【Android开发】安卓炫酷效果集合

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/84605.html

(0)

相关推荐

  • 哈利波特一共几部,哈利.波特小说一共有几部

    技术哈利波特一共几部,哈利.波特小说一共有几部一共就七部咯哈利波特一共几部,都写完咯, 介绍一下七部, 第一部《哈利·波特与魔法石》中的哈利在平常人的世界中并不那么出色,到了魔法世界中,却备受曙目。在霍格沃茨,哈利感受到

    生活 2021年10月20日
  • apr是几月,APR办理护照的时候指的什么

    技术apr是几月,APR办理护照的时候指的什么护照有效期上的APR指的是4月份的意思,10 apr 63应该是“10 apr 13”即到期时间是2013年4月10日apr是几月。1、外交护照和公务护照有效期最长不超过5年

    生活 2021年10月26日
  • MySQL加锁机制的验证记录是什么

    技术MySQL加锁机制的验证记录是什么本篇内容介绍了“MySQL加锁机制的验证记录是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,

    攻略 2021年10月22日
  • ELK安装是怎样的

    技术ELK安装是怎样的这篇文章给大家介绍ELK安装是怎样的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一:安装环境: 1. VMware Workstation Pro 15 下载及安装

    攻略 2021年10月20日
  • 炼铁的原理化学方程式,赤铁矿炼铁的化学方程式是什么

    技术炼铁的原理化学方程式,赤铁矿炼铁的化学方程式是什么赤铁矿炼铁的化学方程式是:Fe₂O₃+3CO=高温=2Fe+3CO₂。 原理:一氧化碳和氧化铁在高温的条件下生成铁和二氧化碳。 赤铁矿石主要用来冶炼生铁。赤铁矿在自然

    生活 2021年10月28日
  • opencore实现了无痛升级吗(opencore是通过什么启动)

    技术OpenCore的优势有哪些这篇文章主要为大家展示了“OpenCore的优势有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“OpenCore的优势有哪些”这篇文章吧。

    攻略 2021年12月24日