大佬教程收集整理的这篇文章主要介绍了Android仿正点闹钟时间齿轮滑动效果,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
看到正点闹钟上的设置时间的滑动效果非常好看,自己就想做一个那样的,在网上就开始搜资料了,看到网上有的齿轮效果的代码非常多,也非常难懂,我就决定自己研究一下,现在我就把我的研究成果分享给大家。我研究的这个效果出来了,而且代码也非常简单,通俗易懂。效果图如下:
首先是MainActivity的布局文件,这个布局文件非常简单,就是一个button:activity_main.xml文件,代码如下:
<?xml version="1.0" enCoding="utf-8"?> <linearLayout xmlns:androID="http://scheR_252_11845@as.androID.com/apk/res/androID" androID:ID="@+ID/ll_timeset" androID:layout_wIDth="fill_parent" androID:layout_height="fill_parent" androID:BACkground="#ffffff" androID:orIEntation="vertical" > <button androID:ID="@+ID/btn" androID:layout_wIDth="fill_parent" androID:layout_height="wrap_content" androID:gravity="center" androID:text="时间设置" androID:textSize="24sp" /> </linearLayout>
紧接着就是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 datetiR_252_11845@e = DateFormat.format("kk:mm",System.currentTimeMillis()).toString(); String[] strs = datetiR_252_11845@e.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,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代码如下:
<?xml version="1.0" enCoding="utf-8"?> <linearLayout xmlns:androID="http://scheR_252_11845@as.androID.com/apk/res/androID" androID:layout_wIDth="fill_parent" androID:layout_height="wrap_content" androID:BACkground="#efefef" androID:orIEntation="vertical" > <TextVIEw 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" /> <!-- 时间的相关设置 --> <linearLayout 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" > <linearLayout androID:layout_wIDth="wrap_content" androID:layout_height="wrap_content" androID:orIEntation="vertical" > <TextVIEw androID:layout_wIDth="30dp" androID:layout_height="wrap_content" androID:layout_gravity="center_horizontal" androID:BACkground="@drawable/wheel_arrow_up" /> <ScrollVIEw 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" > <linearLayout androID:ID="@+ID/ll01" androID:layout_wIDth="50dp" androID:layout_height="wrap_content" androID:gravity="center" androID:orIEntation="horizontal" androID:paddingtop="5dp" > <TextVIEw 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" /> </linearLayout> </ScrollVIEw> <TextVIEw androID:layout_wIDth="30dp" androID:layout_height="wrap_content" androID:layout_gravity="center_horizontal" androID:BACkground="@drawable/wheel_arrow_down" /> </linearLayout> <TextVIEw 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" /> <linearLayout androID:layout_wIDth="wrap_content" androID:layout_height="wrap_content" androID:orIEntation="vertical" > <TextVIEw 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" /> <ScrollVIEw 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" > <linearLayout androID:ID="@+ID/ll02" androID:layout_wIDth="50dp" androID:layout_height="wrap_content" androID:gravity="center" androID:paddingtop="5dp" > <TextVIEw 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" /> </linearLayout> </ScrollVIEw> <TextVIEw 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" /> </linearLayout> <TextVIEw 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" /> </linearLayout> <!-- 设置时钟的按钮 --> <relativeLayout androID:layout_wIDth="fill_parent" androID:layout_height="50dp" > <button 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" /> <button 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" /> </relativeLayout> </linearLayout>
为了让自定义的Dialog的样式更好看,这里还需要自定义样式的Style,Style的代码如下;
<style name="CustomerDateDialog" parent="@androID:theme.Dialog"> <item name="androID:windowFrame">@null</item> <item name="androID:windowNotitle">true</item> <item name="androID:windowBACkground">@color/light_grey</item> <item name="androID:windowIsfloaTing">true</item> <item name="androID:windowContentOverlay">@null</item> </style>
到这里基本上就完了。你看懂了吗?好好研究吧!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。
以上是大佬教程为你收集整理的Android仿正点闹钟时间齿轮滑动效果全部内容,希望文章能够帮你解决Android仿正点闹钟时间齿轮滑动效果所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。