仿ios的自定义dialog和访问服务端加载数据转圈等待效果

大模型应用对比:豆包、腾讯元宝与DeepSeek实战能力解析 大模型应用并非简单比拼参数大小,而是模型能力、推理引擎与产品设计三者协同的结果。理解LLM应用的本质,需从基础概念出发:大语言模型(LLM)通过概率建模生成文本,其实际效果高度依赖工程化落地——包括模型选型(如DeepSeek的代码强项、腾讯混元的多模态优势、豆包的分层模型矩阵)、推理优化(流式响应、预测缓存、约束编译器)以及场景化交互设计。技术价值体现在降低用户决策成本、提升服务闭环效率与增强专业任务可验证性;典型应用场景覆盖生活查询、学术精读、创意文案、逻辑推理及长文档分析。本文基于5类真实任务实测,揭 阅读详情

话不多说,参考github地址:https://github.com/mamumu/mmDialog

添加Add the dependency貌似不好使,直接把库加载进来了

dependencies {
	        implementation 'com.github.mamumu:mmDialog:1.2.0'
	}

github上说的方法不好用,

直接依赖库后,:

package com.kexinlib.base.utils;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.text.TextUtils;
import android.widget.Toast;

import com.mumu.dialog.MMAlertDialog;
import com.mumu.dialog.MMLoading;
import com.mumu.dialog.MMToast;

public class IosDialog {

    private MMLoading mmLoading;
    private static MMToast mmToast;
    private AlertDialog alertDialog;
    private Context context;
    private String msg;
    private boolean autoCancle;
    private boolean showMsg;
    private String cancleText;
    private String confirmText;
    private IosDialog mySelf;
    public IosDialog(Context context) {
        this.context = context;
        msg = "loading...";
        autoCancle = true;
        showMsg = true;
        cancleText = "取消";
        confirmText = "确定";
        mySelf = this;
    }

    public IosDialog setMsg(String msgs) {
        this.msg = msgs;
        if (TextUtils.isEmpty(msg)){
            showMsg = false;
        }
        return this;
    }

    public IosDialog setAutoCancle(boolean autoCancle) {
        this.autoCancle = autoCancle;
        return this;
    }

    public IosDialog setShowMsg(boolean showMsg) {
        this.showMsg = showMsg;
        return this;
    }

    public void loading(){
        if (mmLoading == null) {
            MMLoading.Builder builder = new MMLoading.Builder(context)
                    .setMessage(msg)
                    .setShowMessage(showMsg)
                    .setCancelable(autoCancle)
                    .setCancelOutside(autoCancle);
            mmLoading = builder.create();
        }else {
            mmLoading.dismiss();
            MMLoading.Builder builder = new MMLoading.Builder(context)
                    .setMessage(msg)
                    .setShowMessage(showMsg)
                    .setCancelable(autoCancle)
                    .setCancelOutside(autoCancle);
            mmLoading = builder.create();
        }
        mmLoading.show();
    }
    public void hideLoading() {
        if (mmLoading != null && mmLoading.isShowing()) {
            mmLoading.dismiss();
        }
    }

    public static void showToastSuccess(Context context,String msg) {
        showToast(context,msg,true);
    }

    public static void showToastFailure(Context context,String msg) {
        showToast(context,msg,false);
    }
    private static void showToast(Context context,String msg,boolean success){
        if (mmToast == null) {
            MMToast.Builder builder=new MMToast.Builder(context)
                    .setMessage(msg)
                    .setSuccess(success);
            mmToast=builder.create();
        }else {
            mmToast.cancel();
            MMToast.Builder builder=new MMToast.Builder(context)
                    .setMessage(msg)
                    .setSuccess(success);
            mmToast=builder.create();
        }
        mmToast.show();
    }

    public IosDialog setCancleText(String cancleText) {
        this.cancleText = cancleText;
        return this;
    }

    public IosDialog setConfirmText(String confirmText) {
        this.confirmText = confirmText;
        return this;
    }

    public void showDialog() {
        showDialog2();
    }
    private void showDialog2() {
        dismiss();
        DialogInterface.OnClickListener clickListener = null;
        if (!TextUtils.isEmpty(cancleText)){
            clickListener = new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dismiss();
                    if (onClickListener!=null){
                        onClickListener.onCancle();
                    }
                }
            };
        }

        alertDialog =  MMAlertDialog.showDialog(context,
                "",
                msg,
                cancleText,
                confirmText,
                autoCancle,
                clickListener,
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        if (onClickListener!=null){
                            onClickListener.onConfirm(mySelf);
                        }
                    }
                });
        alertDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
            @Override
            public void onDismiss(DialogInterface dialog) {
                if (onClickListener!=null){
                    onClickListener.onDismiss();
                }
            }
        });
    }
    private OnClickListener onClickListener;

    public IosDialog setOnClickListener(OnClickListener onClickListener) {
        this.onClickListener = onClickListener;
        return this;
    }

    public void dismiss(){
        if (alertDialog!=null){
            alertDialog.dismiss();
        }
    }
    public static class OnClickListener{
       public void onCancle(){}
        public void onConfirm(IosDialog iosDialog){}
        public void onDismiss(){}
    }
}
package im.kexin.app.messenger.utils;

import android.content.Context;
import android.view.View;
import android.widget.Toast;

import com.kexinlib.base.utils.IosDialog;

/**
 * Toast统一管理类
 * 
 */
public class Toasts
{
	private static Toast toast;

	public static void show(Context context,
                            String content, int dur) {
		if (toast == null) {
			toast = Toast.makeText(context,
					content,
					dur);
		} else {
			View view = toast.getView();
			toast.cancel();
			toast= new Toast(context);
			toast.setView(view);
			toast.setDuration(dur);
			toast.setText(content);
		}
		toast.show();
	}
	public static void showTips(Context context,
							String content) {
		if (toast == null) {
			toast = Toast.makeText(context,
					content,
					Toast.LENGTH_SHORT);
		} else {
			View view = toast.getView();
			toast.cancel();
			toast= new Toast(context);
			toast.setView(view);
			toast.setDuration(Toast.LENGTH_SHORT);
			toast.setText(content);

		}

		toast.show();
	}
	public static void show(Context context,
							String content) {
		show(context,content,false);
	}
	public static void show(Context context,
							String content,boolean isSuccess) {
		if (isSuccess){
			IosDialog.showToastSuccess(context,content);
		}else {
			IosDialog.showToastFailure(context,content);
		}

	}
	/*public static void show(Context context,
							String content) {
		if (toast == null) {
			toast = Toast.makeText(context,
					content,
					Toast.LENGTH_SHORT);
		} else {
			View view = toast.getView();
			toast.cancel();
			toast= new Toast(context);
			toast.setView(view);
			toast.setDuration(Toast.LENGTH_SHORT);
			toast.setText(content);

		}

		toast.show();
	}*/
}

所以最后在调用的时候,直接通过调用Toast调用

在访问接口的时候,成功弹出的吐司,是调用三个参数的方法,如果是失败弹出的吐司,那么就是调用两个参数的方法,参考如下:

失败的时候传入两个参数,

Toasts.show(mContext,LocaleController.formatString("search_user_none",R.string.search_user_none));

 成功的时候,传入三个参数,最后一个传入true

Toasts.show(mContext,str,true);

 

访问网络加载数据效果转圈:

package im.kexin.app.messenger.utils;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.text.TextUtils;

import com.android.tu.loadingdialog.LoadingDailog;
import com.kexinlib.base.utils.IosDialog;

import org.telegram.messenger.LocaleController;

import im.kexin.app.messenger.R;

public class LoadingDialogUtils {
    public static IosDialog dialog_ios;
    public static void dismissDialog_ios(){
        if (dialog_ios!=null){
            try {
                dialog_ios.hideLoading();
            } catch (Exception e) {
                e.printStackTrace();
            }
            dialog_ios=null;
        }
    }
    /**
     * 仿iso加载效果
     */
    public static void show(Context context){
        show(context,true);
    }
    public static void show(Context context,boolean autoDismiss){
        show(context,"Loading...",autoDismiss);
    }
    public static void showNoText(Context context,boolean autoDismiss){
        if (dialog_ios!=null){
            dialog_ios.hideLoading();
        }
        dialog_ios = new IosDialog(context).setAutoCancle(autoDismiss).setShowMsg(false);
        dialog_ios.loading();
    }
    public static void showNoText(Context context){
        showNoText(context,true);
    }
    /**
     * 仿iso加载效果
     */
    public static void show(Context context, String info){
        show(context,info,true);
    }
    public static void show(Context context, String info,boolean autoDismiss){
        if (dialog_ios!=null){
            dialog_ios.hideLoading();
        }
        dialog_ios = new IosDialog(context).setAutoCancle(autoDismiss).setMsg(info);
        dialog_ios.loading();
    }
    private String title;
    private String message;
    private boolean showCancle;
    private  OnClickListener onClickListener;
    private Context context;

    public LoadingDialogUtils(Context context) {
        this.context = context;
        this.showCancle = true;
    }
    public LoadingDialogUtils title(String t) {
        this.title = t;
        return this;
    }
    public LoadingDialogUtils message(String t) {
        this.message = t;
        return this;
    }
    public LoadingDialogUtils showCancle(boolean b) {
        this.showCancle = b;
        return this;
    }
    public LoadingDialogUtils listener(OnClickListener t) {
        this.onClickListener = t;
        return this;
    }
    OnDisMissListener onDisMissListener;
    public LoadingDialogUtils disMissListener(OnDisMissListener listener){
        onDisMissListener = listener;
        return this;
    }
    private IosDialog alertDialog;
    public void disMiss(){
        if (alertDialog!=null){
            alertDialog.dismiss();
            alertDialog = null;
        }
    }
    public void show(){
        alertDialog = new IosDialog(context)
                .setMsg(message)
                .setCancleText(showCancle ? LocaleController.formatString("",R.string.cancle) : null)
                .setConfirmText(LocaleController.formatString("",R.string.confirm))
                .setOnClickListener(new IosDialog.OnClickListener(){
                    @Override
                    public void onCancle() {
                        if (onClickListener!=null){
                            onClickListener.onCancle();
                        }
                    }

                    @Override
                    public void onConfirm(IosDialog iosDialog) {
                        iosDialog.dismiss();
                        if (onClickListener!=null){
                            onClickListener.onConfirm();
                        }
                    }

                    @Override
                    public void onDismiss() {
                        if (onDisMissListener!=null){
                            onDisMissListener.ondismiss();
                        }
                    }
                });
        alertDialog.showDialog();


    }
    public interface OnDisMissListener{
        void ondismiss();
    }
    public static class OnClickListener{
        public void onConfirm(){}
        public void onCancle(){}
    }
}

调用方法:

调用接口方法之前第一行:

private void getAll() {
        LoadingDialogUtils.showNoText(mContext);
获取数据成功之后第一行:
LoadingDialogUtils.dismissDialog_ios();

获取数据失败之后第一行:

LoadingDialogUtils.dismissDialog_ios();

 

loadingdialog:Android普通样式加载框和精仿iOS加载框 一,简介 Android普通样式加载框和精仿iOS加载框 动图演示如下: 二,介绍方式 将JitPack存储库添加到您的内置文件中(项目根目录下build.gradle文件) allprojects { repositories { ... maven { url 'https://jitpack.io' } } } 添加依赖项 仅支持AndroidX dependencies { implementation 'com.github.ydstar:loadingdialog:1.0.0' } 立即下载

相关推荐

Android 高仿IOS加载数据时圆形的进度条

Android 执行耗时操作是用到的加载圆形进度条,仿ios的效果

android 等待圈_Android自定义加载等待弹窗控件(仿ios效果实现)

效果图自定义加载Dialog.gif使用说明1、项目下的build.gradle添加allprojects {repositories {...maven { url 'https://www.jitpack.io' }}}2、模块下的build.gradle添加依赖dependencies {compile 'com.github.gittjy:LoadingDialog:1.0.2'}3、在代...

weixin_36333534的博客 470

很好android自定义dialog加载转圈等待,适合初学,透明+正常两种主题

很好android自定义dialog加载转圈等待,适合初学,透明+正常两种主题,屏蔽返回键(自己修改参数,主题也是)

Android仿iOS菊花加载框

实现一个类似iOS的菊花加载框,效果如下: 话不多说,直接上代码。 首先绘制菊花部分: class LoadingView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, @AttrRes defStyleAttr: Int = 0 ) : View(context, attrs, defStyleAttr) { companion object { privat

xuzhb 1160

BubblePagerIndicator:一个视图分页器指示器视图,用于处理大量页面

注意力 我将不再支持它。 只需使用一种更好的解决方案,例如,这个 BubblePagerIndicator 视图分页器指示器视图可处理大量页面。 支持漂亮的缩放和过渡动画。 用法 将mavenCentral()添加到gradle文件中的存储库块中。 将implementation 'com.github.shuhart:bubblepagerindicator:1.2.0'到您的依赖项中。 将BubblePageIndicator添加到您的布局或视图层次结构中: < com .shuhart.bubblepagerindicator.BubblePageIndicator android : id = " @+id/indicator " android : layout_width = " wrap_content " android : layout_he

南邮 2024 软件安全 实验四 自动脱壳+手动脱壳

这次这个实验很简单,就是一个简单的脱壳,然后进行爆破就行了,解法非常的多这里不多讲,会简单讲一下特殊情况这个点开是这样子:然后放进peid里面查看,我这个是原版的PEid,所以显示出来是这样:会显示nothing found,但其实如果你使用吾爱破解的魔改过的peid,它就会显示具体的壳名:然后你点击右下角的那个箭头,里面会有很多的插件用来自动脱壳:你也可以使用这个通用脱壳器,但是脱壳后的程序无法运行,这个放到后面讲。

ARbing_an的博客 2564

探索未来对话的边界:MMDialog - 多模态开放领域对话数据集

探索未来对话的边界:MMDialog - 多模态开放领域对话数据集 在这个数字化时代,自然语言处理和多模态交互正在逐步改变我们与世界的沟通方式。MMDialog 是一个针对这一变革的前沿开源项目,它提供了一个大规模的多回合对话数据集,旨在推动多模态开放领域的对话研究。 项目介绍 MMDialog 数据集是 ACL '23 论文的重点,它的核心是一个包含丰富多模态信息的对话案例集合。每个对话案例都由...

gitblog_00089的博客 535

Linux 使用rm -rf /*命令后,恢复系统方法

Linux 使用rm -rf /*命令后,恢复系统方法 个人学习记录 这里实验环境采用的是radhel7.1的版本: 个人认为核心就是缺失什么组件,就从别的地方复制什么组件过来,先把系统拉起来,再慢慢恢复配置 进入救援模式 1、将/dev/sda两个分区分别挂载看看,里面的内容,有内容的就是根存在的分区 2、ifconfig eno16777777 192.168.8.2 3、从另外一台一样系统的根 。用 tar打包,一个个文件夹拷贝过来 4、到坏系统,scp另外一个系统的etc.tar.gz 5

weixin_43603476的博客 1万+

ajax请求之前,ajax请求完之前的loading加载

很多时候我们需要引入框架来开发项目,这时我们可能会遇到页面还没加载完源码出来了的问题,给用户一种不好的视觉体验,这是便需要loading加载了,来完善用户体验!/*loading.js*/// 加载HTML图 var _LoadingHtml = '加载中。。。';// 呈现loading效果document.write(_LoadingHtml);// 监听加载状态改变document.onre...

weixin_32705179的博客 961

配电网可靠性评估(一)—最小路法和非序贯蒙特卡洛模拟法的matlab实现

电力系统的可靠性研究是相关领域的热点问题。根据研究对象的不同,又可分为发电系统的可靠性,输电系统的可靠性和配电系统的可靠性。配电网在电力系统中处于最末端的位置,直接和用户相连,一旦出现故障情况,就会在用户侧表现为停电事故。因此对配电网的可靠性评估有着重大意义。......

配电网和matlab的博客 1万+

ANSYS_APDL实战入门——从零开始掌握模态分析

本文为ANSYS APDL模态分析实战入门指南,通过一个悬臂梁案例,手把手教你从零开始掌握APDL命令流。内容涵盖从模型创建、材料定义、网格划分到边界条件设置、求解及后处理结果查看的全流程,帮助工程师快速上手结构动力学分析,避免共振风险。

egg99的博客 1132

material 风格和 ios 风格,可传入 context 构建,可在任意界面弹出,包含了 loading,alert,单选和多选对话框,输入对话框,actionSheet 和 bottomShe

material 风格和 ios 风格,可传入 context 构建,可在任意界面弹出,包含了 loading,alert,单选和多选对话框,输入对话框,actionSheet 和 bottomSheet.

未来很长,但我会努力的走下去。 1624

多标签分类怎么做?(Python)

首先简单介绍下,多标签分类与多分类、多任务学习的关系: 多分类学习(Multi-class):分类器去划分的类别是多个的,但对于每一个样本只能有一个类别,类别间是互斥的。例如:分类器判断这只动物是猫、狗、猪,每个样本只能有一种类别,就是一个三分类任务。常用的做法是OVR、softmax多分类

y1282037271的博客 1360

面试题kkk

这篇文章摘要主要涵盖了Android开发中的核心知识点和技术难点,包括数据结构、Java与Kotlin语言特性、多线程与并发、内存管理、安卓组件与UI、IPC通信、数据库、多媒体处理、设计模式、性能优化、跨端开发等多个方面。文章详细解析了常见数据结构的使用与实现、JVM机制、内存泄漏分析与解决方案、Activity生命周期、事件分发机制、Handler原理、音视频处理、设计模式应用等核心内容,并提供了实际项目中的技术卡点与解决方案。此外,还涉及了性能优化策略、跨端开发差异、技术方案设计思路以及Git常用命令

mix39的博客 931

003、高通骁龙Spectra ISP架构深度解析:IFE/BPS/IPE流水线与Chromatix调优实战

摘要: 本文深入解析高通骁龙Spectra ISP架构,重点剖析IFE、BPS、IPE三阶段的流水线协作机制与Chromatix调优实战。通过夜景预览"水波纹"案例,揭示HDR对齐与TNR运动估计的关联性问题,指出ISP调优需关注模块间的时序与带宽约束。文章详解各模块核心功能:IFE负责RAW域处理(HDR合成/校正),BPS专注降噪与细节增强,IPE进行YUV域精处理。针对Chromatix调优,强调参数与寄存器映射关系,并给出LSC网格密度、TNR运动灵敏度、LTM光晕等典型问题的解决方案。最后提出实用

zzfmlxs的博客 233

LoRa学习:LoRa通信调制解调的实现原理与性能

LoRa学习:LoRa调制解调原理与性能 1、LoRa调制解调器原理 LoRa调制解调器采用专利扩频调制和前向纠错技术。与传统的FSK、OOK调制技术相比,LoRa扩大了无线通讯链路的覆盖范围(实现了远距离无线传输),提高了链路的鲁棒性。。 开发人员可调整扩频因子和纠错率这两个参数,从而平衡通讯时的带宽占用、通信速率、空中包的存活时间、以及抗干扰性等。。 LoRa调制解调器...

HowieXue 薛永浩的博客 3万+

(2023,LLM,扩散,标记对齐,两阶段训练)MiniGPT-5:通过生成式 Voken 进行交错视觉和语言生成

本文提出 MiniGPT-5,它以 “生成式 Voken” 的概念为基础,通过将 LLM 与预训练的文本到图像生成模型对齐,来生成带有连贯文本叙述的图像。介绍了一种用于无描述多模态生成的两阶段训练策略。

qq_44681809的博客 1075

杰理AC696N系列芯片外部中断使用教程

本教程详细介绍了杰理AC696N芯片的GPIO引脚中断唤醒功能实现方法。主要内容包括: 功能特点: 支持任意GPIO引脚配置为中断源 可灵活选择上升沿或下降沿触发 提供自定义中断回调函数接口 核心实现: 通过port_wkup_interrupt_init()函数配置GPIO属性 使用request_irq()注册中断服务程序 提供中断使能/关闭接口 注意事项: 此功能在低功耗模式下无效 需注意引脚冲突和中断优先级设置 建议在回调函数中实现简洁的逻辑 应用场景: 按键检测 外部信号监测 事件触发等 本方案提

qq_42014563的博客 944

探索视觉语言模型的前沿:对当前方法和未来方向的调查

大型语言模型(LLMs)的出现显著改变了人工智能革命的轨迹。然而,这些LLMs表现出一个显著的局限,即它们主要擅长处理文本信息。为了解决这一限制,研究人员努力将视觉能力与LLMs整合,从而催生了视觉语言模型(VLMs)的出现。这些先进模型在处理更复杂的任务,如图像字幕和视觉问题回答方面发挥着重要作用。在我们的综合调查论文中,我们深入探讨了视觉语言模型领域的关键进展。我们将VLMs分为三个不同类别:专注于视觉语言理解的模型,处理多模输入以生成单模(文本)输出的模型,以及既接受又产生多模输入和输出的模型。

数智笔记 1349

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

android 加载数据或提交数据时显示转圈的提示页面

android 加载数据或提交数据时显示转圈的提示页面        提前声明一下,本博客全是自己的理解,如果内容中有理解错误的地方,欢迎指正。另外,博客内容有参考其他博客,本博客只用来学习。        当我们进入到一个页面时,通常先会出现一个转圈的dialog,这是因为这个页面需要加载数据,为了防止数据加载完成前空白的页面,通常会先显示转圈的dialog,直到数据加载完成

努力ing的菜鸟 1万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Android万能的等待框(Dialog)超级好用

由于公司有开了新项目,由于公司之前没啥框架,所以只能自己搭框架了 dialog等待框,弹出选择框都是很常用的,所以感觉有找一个比较好的框架。 借鉴了很多大牛的代码,又亲自运行一下,感觉这个还不错。 仿微信的等待框 转圈圈的等待框,文字的颜色原本是不可以修改的,但是大家可以自己改源码 这个是一个三个按钮的文本框选择提示框 这个是一个多选框,确定以后取数据可能有点麻烦。大家可以自己试着修改修

Mr小颜同学的博客 1万+

Android 常用的提示框Dialog

BaseDialog 常用的提示框,输入框,弹窗等 使用方式 build.gradle(project) allprojects { repositories { ... maven { url 'https://jitpack.io' } } } build.gradle(module app) dependencies { impleme...

1万+

Android 图片Loading旋转动画效果

在数据请求或者一些加载的页面中,总需要一些过度的动画效果,很多时候我们都可以在图片中间加一个loading的旋转图片,以前也做过,今天做的时候噼里啪啦敲了半天结果运行没效果,所以今天总结下这个啷个做的。eg:animation只是操作View 的位图表示(bitmap representation),而不是真正的改变View的位置,位图就是bitmap,关于bitmap,可以去好好学习一下!例子:我们要加载一个webView,需要在加载前的空白页面中间加一个旋转的loading图片,结束后就消失。

Android 领域开发程序员,希望通过写博客的方式不断的总结提升自己,大家共同进步哦! 4226

Android dialog弹窗

https://github.com/HanHuoBin/BaseDialog AlertDialog

Anita99的博客 536

自定义view画个圈圈

圆形头像

qq_29618481的博客 451

android酷炫转圈动画,一款非常简单酷炫的LoadingView动画效果

今天看到一个银行的APP上面的loadingview 挺好的,就尝试着自己实现,觉得很简单,但自己实现起来还是发现了一些问题。LoadingView和下图类似:实现的代码也不是很复杂,就是小球的运动轨迹需要计算,我自己手画了个计算的图,很简单的就是三角函数的使用。然后代码就是代码实现了,主要的内容都有注释,代码如下:public class LoadingView extends View {pr...

weixin_36328210的博客 596
上一篇: SmartRefreshLayout 下拉刷新和上拉加载更多数据处理
下一篇: 集成极光统计SDK 并从极光统计网页中查看崩溃日志注意事项
fyldragonfyl
博客等级 码龄12年 9粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值