程序笔记   发布时间:2022-06-07  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Android仿正点闹钟时间齿轮滑动效果大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

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

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手机闹钟服务AlarmManagerk开发案例
  • 简单实现Android闹钟程序 附源码
  • Android闹钟设置的解决方案
  • Android编程闹钟设置方法详解
  • Android自定义View 实现闹钟唤起播放闹钟铃声功能
  • 简单实现Android闹钟功能
  • Android闹钟机制实现定时任务功能
  • Android如何在App中启动系统闹钟
  • Android使用COuntDownTimer类实现倒计时闹钟
  • android用闹钟定时做http请求推送的解决方案

大佬总结

以上是大佬教程为你收集整理的Android仿正点闹钟时间齿轮滑动效果全部内容,希望文章能够帮你解决Android仿正点闹钟时间齿轮滑动效果所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。