看到正点闹钟上的设置时间的滑动效果非常好看,自己就想做一个那样的,在网上就开始搜资料了,看到网上有的齿轮效果的代码非常多,也非常难懂,我就决定自己研究一下,现在我就把我的研究成果分享给大家。我研究的这个效果出来了,而且代码也非常简单,通俗易懂。效果图如下:

首先是MainActivity的布局文件,这个布局文件非常简单,就是一个Button:activity_main.xml文件,代码如下:

android:id="@+id/ll_timeset"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:background="#ffffff"

android:orientation="vertical" >

android:id="@+id/btn"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:gravity="center"

android:text="时间设置"

android:textSize="24sp" />

紧接着就是MainActivity的代码,代码如下:

package net.loonggg.test;

import net.loonggg.view.CustomerDateDialog;

import net.loonggg.view.CustomerDateDialog.DateDialogListener;

import android.app.Activity;

import android.os.Bundle;

import android.text.format.DateFormat;

import android.view.View;

import android.view.Window;

import android.widget.Button;

import android.widget.Toast;

public class MainActivity extends Activity {

private int h, m;

private CustomerDateDialog dialog;

private Button btn;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

requestWindowFeature(Window.FEATURE_NO_TITLE);

setContentView(R.layout.activity_main);

btn = (Button) findViewById(R.id.btn);

btn.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

String datetime = DateFormat.format("kk:mm",

System.currentTimeMillis()).toString();

String[] strs = datetime.split(":");

h = Integer.parseInt(strs[0]);

m = Integer.parseInt(strs[1]);

dialog = new CustomerDateDialog(MainActivity.this, h, m);

dialog.show();

dialog.setOnDateDialogListener(new DateDialogListener() {

@Override

public void getDate() {

Toast.makeText(

MainActivity.this,

"时间是:" + dialog.getSettingHour() + "点"

+ dialog.getSettingMinute() + "分",

Toast.LENGTH_LONG).show();

}

});

}

});

}

}

再就是我自定义了一个时钟的Dialog,自定义Dialog也非常简单,自己可以学一下,这方面网上的资料非常多。现在我把我自定义时钟的Dialog的代码分享一下,代码如下:

package net.loonggg.view;

import net.loonggg.test.R;

import android.annotation.SuppressLint;

import android.app.Dialog;

import android.content.Context;

import android.os.Bundle;

import android.os.Handler;

import android.view.LayoutInflater;

import android.view.MotionEvent;

import android.view.View;

import android.view.View.OnTouchListener;

import android.view.ViewTreeObserver;

import android.view.ViewTreeObserver.OnGlobalLayoutListener;

import android.widget.Button;

import android.widget.LinearLayout;

import android.widget.ScrollView;

import android.widget.TextView;

@SuppressLint("HandlerLeak")

public class CustomerDateDialog extends Dialog {

private View customView;

private Button setBtn;

private Button cancleBtn;

private TextView arrow_up;

private TextView tv01, tv02;

private ScrollView sv01, sv02;

private LinearLayout llTimeWheel;

private DateDialogListener listener;

private int lastY;

private int flag;// 标记时分

private int itemHeight;// 每一行的高度

private int pHour, pMinute;// 初始化时显示的时分时间

private int setHour, setMinute;

public CustomerDateDialog(Context context, int hour, int minute) {

super(context, R.style.CustomerDateDialog);

customView = LayoutInflater.from(context).inflate(R.layout.time_wheel,

null);

init(context, hour, minute);

}

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

this.setContentView(customView);

}

private void init(Context context, final int hour, final int minute) {

tv01 = (TextView) customView.findViewById(R.id.tv01);

tv02 = (TextView) customView.findViewById(R.id.tv02);

sv01 = (ScrollView) customView.findViewById(R.id.sv01);

sv02 = (ScrollView) customView.findViewById(R.id.sv02);

setBtn = (Button) customView.findViewById(R.id.setBtn);

cancleBtn = (Button) customView.findViewById(R.id.cancleBtn);

arrow_up = (TextView) customView.findViewById(R.id.arrow_up);

this.pHour = hour;

this.pMinute = minute;

setHour = pHour;

setMinute = pMinute;

llTimeWheel = (LinearLayout) customView

.findViewById(R.id.ll_time_wheel);

setHourDial(tv01);

setMinuteDial(tv02);

sv01.setOnTouchListener(tListener);

sv02.setOnTouchListener(tListener);

final ViewTreeObserver observer = sv01.getViewTreeObserver();// observer

// 作用当视图完全加载进来的时候再取控件的高度,否则取得值是0

observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

@SuppressWarnings("deprecation")

public void onGlobalLayout() {

int tvHeight = tv02.getHeight();

itemHeight = tvHeight / 180;

if (sv01.getViewTreeObserver().isAlive()) {

sv01.getViewTreeObserver().removeGlobalOnLayoutListener(

this);

}

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(

LinearLayout.LayoutParams.FILL_PARENT, (itemHeight * 3)

+ arrow_up.getHeight() * 2);

llTimeWheel.setLayoutParams(params);

sv01.setLayoutParams(new LinearLayout.LayoutParams(tv02

.getWidth(), (itemHeight * 3)));

sv02.setLayoutParams(new LinearLayout.LayoutParams(tv02

.getWidth(), (itemHeight * 3)));

sv01.scrollTo(0, (pHour + 23) * itemHeight);

sv02.scrollTo(0, (pMinute + 59) * itemHeight);

}

});

setBtn.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

getSettingDate();

CustomerDateDialog.this.cancel();

}

});

cancleBtn.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

CustomerDateDialog.this.cancel();

}

});

}

private OnTouchListener tListener = new OnTouchListener() {

public boolean onTouch(View v, MotionEvent event) {

if (v == sv01) {

flag = 1;

} else {

flag = 2;

}

if (event.getAction() == MotionEvent.ACTION_UP) {

final ScrollView sv = (ScrollView) v;

lastY = sv.getScrollY();

System.out.println("lastY" + lastY);

handler.sendMessageDelayed(handler.obtainMessage(0, v), 50);

}

return false;

}

};

private Handler handler = new Handler() {

@SuppressLint("HandlerLeak")

public void handleMessage(android.os.Message msg) {

ScrollView sv = (ScrollView) msg.obj;

if (msg.what == 0) {

if (lastY == sv.getScrollY()) {

int num = lastY / itemHeight;

int over = lastY % itemHeight;

if (over > itemHeight / 2) {// 超过一半滚到下一格

locationTo((num + 1) * itemHeight, sv, flag);

} else {// 不到一半滚回上一格

locationTo(num * itemHeight, sv, flag);

}

} else {

lastY = sv.getScrollY();

handler.sendMessageDelayed(handler.obtainMessage(0, sv), 50);// 滚动还没停止隔50毫秒再判断

}

}

};

};

private void locationTo(int position, ScrollView scrollview, int flag) {

switch (flag) {

case 1:

int mPosition = 0;

if (position <= 23 * itemHeight) {

mPosition = position + 24 * itemHeight;

scrollview.scrollTo(0, mPosition);

} else if (position >= 48 * itemHeight) {

mPosition = position - 24 * itemHeight;

scrollview.scrollTo(0, mPosition);

} else {

mPosition = position;

scrollview.smoothScrollTo(0, position);

}

setHour = (mPosition / itemHeight - 23) % 24;

break;

case 2:

int hPosition = 0;

if (position <= 57 * itemHeight) {

hPosition = position + 60 * itemHeight;

scrollview.scrollTo(0, hPosition);

} else if (position >= 120 * itemHeight) {

hPosition = position - 60 * itemHeight;

scrollview.scrollTo(0, hPosition);

} else {

hPosition = position;

scrollview.smoothScrollTo(0, position);

}

setMinute = (hPosition / itemHeight) % 60 + 1;

break;

}

}

/**

* 设置分刻度盘

*

* @param tv

*/

private void setMinuteDial(TextView tv) {

StringBuffer buff = new StringBuffer();

for (int i = 0; i < 3; i++) {

for (int j = 0; j < 60; j++) {

if (j <= 9) {

buff.append("0" + j);

} else {

buff.append(j + "");

}

}

}

tv.setText(buff);

}

/**

* 设置时刻度盘

*

* @param tv

*/

private void setHourDial(TextView tv) {

StringBuffer buff = new StringBuffer();

for (int i = 0; i < 3; i++) {

for (int j = 0; j < 24; j++) {

if (j <= 9) {

buff.append("0" + j);

} else {

buff.append(j + "");

}

}

}

tv.setText(buff);

}

public void setpHour(int pHour) {

this.pHour = pHour;

}

public void setpMinute(int pMinute) {

this.pMinute = pMinute;

}

public void setOnDateDialogListener(DateDialogListener listener) {

this.listener = listener;

}

public interface DateDialogListener {

void getDate();

}

public void getSettingDate() {

if (listener != null) {

listener.getDate();

}

}

public int getSettingHour() {

return setHour;

}

public int getSettingMinute() {

return setMinute;

}

}

这里光有java代码还不够,还有自定义Dialog的布局文件,time_wheel.xml代码如下:

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:background="#efefef"

android:orientation="vertical" >

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:background="@color/light_black"

android:paddingLeft="10dp"

android:text="设置时间"

android:textColor="@color/black"

android:textSize="24sp" />

android:id="@+id/ll_time_wheel"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:layout_marginTop="15dp"

android:background="#f0f0f0"

android:gravity="center_horizontal"

android:orientation="horizontal" >

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:orientation="vertical" >

android:layout_width="30dp"

android:layout_height="wrap_content"

android:layout_gravity="center_horizontal"

android:background="@drawable/wheel_arrow_up" />

android:id="@+id/sv01"

android:layout_width="50dp"

android:layout_height="wrap_content"

android:layout_gravity="center_horizontal"

android:background="@drawable/time_bg"

android:scrollbars="none" >

android:id="@+id/ll01"

android:layout_width="50dp"

android:layout_height="wrap_content"

android:gravity="center"

android:orientation="horizontal"

android:paddingTop="5dp" >

android:id="@+id/tv01"

android:layout_width="50dp"

android:layout_height="wrap_content"

android:gravity="center"

android:lineSpacingExtra="20dp"

android:paddingLeft="10dp"

android:paddingRight="10dp"

android:textSize="26sp" />

android:layout_width="30dp"

android:layout_height="wrap_content"

android:layout_gravity="center_horizontal"

android:background="@drawable/wheel_arrow_down" />

android:layout_width="wrap_content"

android:layout_height="fill_parent"

android:layout_gravity="center"

android:background="#f0f0f0"

android:gravity="center"

android:text="时"

android:textColor="#000000"

android:textSize="25sp" />

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:orientation="vertical" >

android:id="@+id/arrow_up"

android:layout_width="30dp"

android:layout_height="wrap_content"

android:layout_gravity="center_horizontal"

android:background="@drawable/wheel_arrow_up" />

android:id="@+id/sv02"

android:layout_width="50dp"

android:layout_height="wrap_content"

android:layout_gravity="center_horizontal"

android:background="@drawable/time_bg"

android:scrollbars="none" >

android:id="@+id/ll02"

android:layout_width="50dp"

android:layout_height="wrap_content"

android:gravity="center"

android:paddingTop="5dp" >

android:id="@+id/tv02"

android:layout_width="50dp"

android:layout_height="wrap_content"

android:gravity="center"

android:lineSpacingExtra="20dp"

android:paddingLeft="10dp"

android:paddingRight="10dp"

android:textSize="26sp" />

android:id="@+id/arrow_down"

android:layout_width="30dp"

android:layout_height="wrap_content"

android:layout_gravity="center_horizontal"

android:background="@drawable/wheel_arrow_down" />

android:layout_width="wrap_content"

android:layout_height="fill_parent"

android:layout_gravity="center"

android:background="#f0f0f0"

android:gravity="center"

android:text="分"

android:textColor="#000000"

android:textSize="25sp" />

android:layout_width="fill_parent"

android:layout_height="50dp" >

android:id="@+id/setBtn"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentLeft="true"

android:layout_gravity="center_horizontal"

android:layout_marginLeft="25dp"

android:background="@drawable/btn_clock_normal"

android:gravity="center"

android:paddingLeft="10dp"

android:paddingRight="10dp"

android:text="确定"

android:textColor="#000000"

android:textSize="24sp" />

android:id="@+id/cancleBtn"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentRight="true"

android:layout_gravity="center_horizontal"

android:layout_marginRight="25dp"

android:background="@drawable/btn_clock_normal"

android:gravity="center"

android:paddingLeft="10dp"

android:paddingRight="10dp"

android:text="取消"

android:textColor="#000000"

android:textSize="24sp" />

为了让自定义的Dialog的样式更好看,这里还需要自定义样式的Style,Style的代码如下;

@null

true

@color/light_grey

true

@null

到这里基本上就完了。你看懂了吗?好好研究吧!

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

android 齿轮动画,Android仿正点闹钟时间齿轮滑动效果相关推荐

  1. android 辐射动画_Android仿微信雷达辐射搜索好友(逻辑清晰实现简单)

    不知不觉这个春节也已经过完了,遗憾家里没网,没能及时给大家送上祝福,今天回到深圳,明天就要上班了,小伙伴们是不是和我一样呢?今天讲的是一个大家都见过的动画,雷达搜索好友嘛,原理也十分的简单,你看完我的 ...

  2. android菊花动画,Android实现仿iOS菊花加载圈动画效果

    常见的实现方式 切图,做旋转动画 自定义View,绘制效果 gif图 1.切图会增加体积,但相对简单,不过在换肤的场景下,会使用不同颜色,需要准备多张图,不够灵活. 2.由于自定义的好处,不同颜色只需 ...

  3. android 齿轮动画,Android(Animation): 一直转个不停的齿轮

    利用RotateAnimation实现齿轮的无限匀速转动: 效果图: (不会做动态图,齿轮其实一直在转动) 基本代码如下: 1. Activity的布局文件: android:layout_width ...

  4. android菊花动画,Android仿ios加载时菊花图

    第一步: /** * 显示正在加载动画 * @param context */ public static Dialog showLoadingDialog(Context context){ //创 ...

  5. android开发游记:仿支付宝余额数字累加滚动效果的实现

    支付宝更新9.0后,细心的朋友会发现新增了一个动画效果,就是进入我的钱包的时候,我的余额会有一段滚动显示的动画效果,比如说你有100块,余额就从0滚动到100,看到自己的钱在不断涨,让我们这些穷屌丝莫 ...

  6. android 减速动画,Android View Animation

    概述 可译为视图动画,分为 缩放动画 平移动画 渐变动画 旋转动画 Android系统中定义了一个抽象类Animation来定义这种视图动画,它的具体子类如下表: 动画名称 对应的子类 xml中标签 ...

  7. Android横向滚动卡片,Android仿探探卡片式滑动效果实现

    前言 第一次进入探探软件界面,就被这种通过卡片式滑动来选择"喜欢/不喜欢"的设计所吸引了.当时就非常想通过自己来实现这种仿探探式的效果,然而却没什么思路.不过毋庸置疑的是,这种效果 ...

  8. android 逐字动画,Android实现文本逐字显示View(类似rpg游戏人物对话,文本逐字显示)...

    前面好多篇文章都是Android Studio.源码编译.ndk等相关教程,今天敲一敲代码,不然都生锈了哈_. 来个古装动画美图,缓解大家疲劳的眼睛...(话说有木有人知道这是谁???) Paste_ ...

  9. android触摸效果,Android开发进阶:仿MIUI12控件触摸反馈效果(下沉+倾斜)附源码...

    简单模仿了下MIUI12里控件的触摸反馈效果,转载请标明出处 效果简述 按压控件内圈区域,控件整体缩小,高度降低(阴影消失) 按压内圈 按压控件外圈区域,依据触摸点控件以中心为支点,向触摸点倾斜 按压 ...

最新文章

  1. shardingjdbc全局表_Sharding-JDBC 分库分表概述
  2. Git 的介绍使用以及简单操作流程
  3. 最近无埋点技术很是流行,抽空研究了下诸葛IO,talkingData以及百分点这些业内知名公司的无埋点SDK,抽取其中重要的信息供大家参考:
  4. vue路由+ elementUI表格组件:loop文章列表页enter内容页(vue路由传参userid)- 代码篇
  5. 基本sql语句--入门语句
  6. Output argument fuse (and maybe others) not assigned during call to
  7. OPNET网络仿真分析-1.2、OPNET安装教程
  8. 深度学习 --- 卷积神经网络CNN(LeNet-5网络学习算法详解)
  9. 苹果home键在哪里设置_苹果手机怎样添加辅助触控功能
  10. idea加载jsp项目无法打开web页面
  11. python读取组合惯导数据,并进行坐标转换到北东天、utm坐标系
  12. 安信可A9G二次开发的准备工作
  13. Windows设置开机自启动bat脚本
  14. 人工智能真的具有创造力?
  15. 基于双服务器的抗关键词猜测攻击的公钥可搜索加密方案
  16. 计算任意2个日期内的工作日(没有考虑到国定假日
  17. MySQL必知必会(1)
  18. 【100个 Unity小知识点】☀️ | Unity 中怎样读取Excel文件
  19. 凯泽窗带通滤波器MATLAB,用凯泽窗设计线性相位带通FIR滤波器
  20. 语音识别芯片的基本原理和工作流程

热门文章

  1. php数独,php数独求解
  2. 「精研科技」× 企企通,全球MIM龙头借助采购供应商数字化向多领域突破
  3. 解决开机提示High Severity Error问题
  4. 第一章 计算机基础知识【信息学奥赛】
  5. bash管道符开启子进程
  6. 嵌入式--LCD常用接口介绍
  7. Flink中的CEP(二)
  8. 如何设置海思开发板的静态IP
  9. 海思开发板学习记录2----- 开发板配置tftp 服务
  10. 无线局域网攻防之Wi-Fi破解