android 齿轮动画,Android仿正点闹钟时间齿轮滑动效果
看到正点闹钟上的设置时间的滑动效果非常好看,自己就想做一个那样的,在网上就开始搜资料了,看到网上有的齿轮效果的代码非常多,也非常难懂,我就决定自己研究一下,现在我就把我的研究成果分享给大家。我研究的这个效果出来了,而且代码也非常简单,通俗易懂。效果图如下:
首先是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仿正点闹钟时间齿轮滑动效果相关推荐
- android 辐射动画_Android仿微信雷达辐射搜索好友(逻辑清晰实现简单)
不知不觉这个春节也已经过完了,遗憾家里没网,没能及时给大家送上祝福,今天回到深圳,明天就要上班了,小伙伴们是不是和我一样呢?今天讲的是一个大家都见过的动画,雷达搜索好友嘛,原理也十分的简单,你看完我的 ...
- android菊花动画,Android实现仿iOS菊花加载圈动画效果
常见的实现方式 切图,做旋转动画 自定义View,绘制效果 gif图 1.切图会增加体积,但相对简单,不过在换肤的场景下,会使用不同颜色,需要准备多张图,不够灵活. 2.由于自定义的好处,不同颜色只需 ...
- android 齿轮动画,Android(Animation): 一直转个不停的齿轮
利用RotateAnimation实现齿轮的无限匀速转动: 效果图: (不会做动态图,齿轮其实一直在转动) 基本代码如下: 1. Activity的布局文件: android:layout_width ...
- android菊花动画,Android仿ios加载时菊花图
第一步: /** * 显示正在加载动画 * @param context */ public static Dialog showLoadingDialog(Context context){ //创 ...
- android开发游记:仿支付宝余额数字累加滚动效果的实现
支付宝更新9.0后,细心的朋友会发现新增了一个动画效果,就是进入我的钱包的时候,我的余额会有一段滚动显示的动画效果,比如说你有100块,余额就从0滚动到100,看到自己的钱在不断涨,让我们这些穷屌丝莫 ...
- android 减速动画,Android View Animation
概述 可译为视图动画,分为 缩放动画 平移动画 渐变动画 旋转动画 Android系统中定义了一个抽象类Animation来定义这种视图动画,它的具体子类如下表: 动画名称 对应的子类 xml中标签 ...
- Android横向滚动卡片,Android仿探探卡片式滑动效果实现
前言 第一次进入探探软件界面,就被这种通过卡片式滑动来选择"喜欢/不喜欢"的设计所吸引了.当时就非常想通过自己来实现这种仿探探式的效果,然而却没什么思路.不过毋庸置疑的是,这种效果 ...
- android 逐字动画,Android实现文本逐字显示View(类似rpg游戏人物对话,文本逐字显示)...
前面好多篇文章都是Android Studio.源码编译.ndk等相关教程,今天敲一敲代码,不然都生锈了哈_. 来个古装动画美图,缓解大家疲劳的眼睛...(话说有木有人知道这是谁???) Paste_ ...
- android触摸效果,Android开发进阶:仿MIUI12控件触摸反馈效果(下沉+倾斜)附源码...
简单模仿了下MIUI12里控件的触摸反馈效果,转载请标明出处 效果简述 按压控件内圈区域,控件整体缩小,高度降低(阴影消失) 按压内圈 按压控件外圈区域,依据触摸点控件以中心为支点,向触摸点倾斜 按压 ...
最新文章
- shardingjdbc全局表_Sharding-JDBC 分库分表概述
- Git 的介绍使用以及简单操作流程
- 最近无埋点技术很是流行,抽空研究了下诸葛IO,talkingData以及百分点这些业内知名公司的无埋点SDK,抽取其中重要的信息供大家参考:
- vue路由+ elementUI表格组件:loop文章列表页enter内容页(vue路由传参userid)- 代码篇
- 基本sql语句--入门语句
- Output argument fuse (and maybe others) not assigned during call to
- OPNET网络仿真分析-1.2、OPNET安装教程
- 深度学习 --- 卷积神经网络CNN(LeNet-5网络学习算法详解)
- 苹果home键在哪里设置_苹果手机怎样添加辅助触控功能
- idea加载jsp项目无法打开web页面
- python读取组合惯导数据,并进行坐标转换到北东天、utm坐标系
- 安信可A9G二次开发的准备工作
- Windows设置开机自启动bat脚本
- 人工智能真的具有创造力?
- 基于双服务器的抗关键词猜测攻击的公钥可搜索加密方案
- 计算任意2个日期内的工作日(没有考虑到国定假日
- MySQL必知必会(1)
- 【100个 Unity小知识点】☀️ | Unity 中怎样读取Excel文件
- 凯泽窗带通滤波器MATLAB,用凯泽窗设计线性相位带通FIR滤波器
- 语音识别芯片的基本原理和工作流程