原来朋友给过的一个 显示时间的 样例,还能够改动时间,可是要机子有root权限才干改动。

在这个时间表盘的样例基础上 改动改动  图片。背景图什么的      就能够达到自己想要的效果了。。

下载地址:  http://download.csdn.net/detail/kongbaidepao/8090083

1个风车效果的样例

是依据手滑动的速度 转动快慢的

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva29uZ2JhaWRlcGFv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

代码不多,直接粘过来

public class MainActivity extends Activity {

    @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RotatView rotatView=(RotatView)findViewById(R.id.myRotatView);
rotatView.setRotatDrawableResource(R.drawable.cycle);
} }
public class RotatView extends View {

    //原心坐标x
float o_x;
float o_y; /**
* 处理惯性的handler
*/
Handler handler;
//handler处理消息的间隔
int delayedTime = 20; /**
* 消息信号,滚动的标识
*/
static final int play = 0; /**
* 消息信号,停止滚动的标识
*/
static final int stop = 1; /**
* 上次记录的时间,计算一定时间所走过的弧度、计算速度.
*/
double currentTime = 0; /**
* 图片的宽度
*/
int width; /**
* 图片的高度
*/
int height; /**
* view的真实宽度与高度:由于是旋转。所以这个view是正方形,它的值是图片的对角线长度
*/
double maxwidth; /**
* 旋转的图片
*/
Bitmap rotatBitmap; public RotatView(Context context, AttributeSet attrs) {
super(context, attrs);
init(); } /**
* 初始化handler与速度计算器
*/
private void init() {
vRecord = new VRecord();
handler = new Handler() { @Override
public void handleMessage(Message msg) { double detaTime = System.currentTimeMillis() - currentTime;
switch (msg.what) { case play: {
if (isClockWise) {
speed = speed - a * detaTime;
if (speed <= 0) {
return;
} else {
handler.sendEmptyMessageDelayed(play, delayedTime);
}
} else {
speed = speed + a * detaTime;
if (speed >= 0) {
return;
} else {
handler.sendEmptyMessageDelayed(play, delayedTime);
}
} addDegree((float)(speed * detaTime + (a * detaTime * detaTime) / 2)); // if (a < a_max) {
// a = (float)(a + a_add*detaTime);
// System.out.println("a:"+a);
// }
currentTime = System.currentTimeMillis();
invalidate(); break;
}
case stop: {
speed = 0;
handler.removeMessages(play);
}
} super.handleMessage(msg);
}
};
// 默认是有一张图片的 initSize();
} public void setRotatBitmap(Bitmap bitmap) {
rotatBitmap = bitmap;
initSize();
postInvalidate();
} public void setRotatDrawableResource(int id) { BitmapDrawable drawable = (BitmapDrawable)getContext().getResources().getDrawable(id); setRotatDrawable(drawable);
} public void setRotatDrawable(BitmapDrawable drawable) {
rotatBitmap = drawable.getBitmap();
initSize();
postInvalidate();
} private void initSize() {
if (rotatBitmap == null) { // throw new NoBitMapError("Error,No bitmap in RotatView!");
return;
}
width = rotatBitmap.getWidth();
height = rotatBitmap.getHeight(); maxwidth = Math.sqrt(width * width + height * height); o_x = o_y = (float)(maxwidth / 2);//确定圆心坐标
} /**
* 通过此方法来控制旋转度数,假设超过360,让它求余,防止,该值过大造成越界
*
* @param added
*/
private void addDegree(float added) {
deta_degree += added;
if (deta_degree > 360 || deta_degree < -360) {
deta_degree = deta_degree % 360;
} } @Override
protected void onDraw(Canvas canvas) { Matrix matrix = new Matrix();
// 设置转轴位置
matrix.setTranslate((float)width / 2, (float)height / 2); // 開始转
matrix.preRotate(deta_degree);
// 转轴还原
matrix.preTranslate(-(float)width / 2, -(float)height / 2); // 将位置送到view的中心
matrix.postTranslate((float)(maxwidth - width) / 2, (float)(maxwidth - height) / 2); canvas.drawBitmap(rotatBitmap, matrix,paint); super.onDraw(canvas);
} Paint paint=new Paint();
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// TODO Auto-generated method stub
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
// 它的宽高不是图片的宽高,而是以宽高为直角的矩形的对角线的长度
setMeasuredDimension((int)maxwidth, (int)maxwidth); } /**
* 手指触屏的初始x的坐标
*/
float down_x; /**
* 手指触屏的初始y的坐标
*/
float down_y; /**
* 移动时的x的坐标
*/
float target_x; /**
* 移动时的y的坐标
*/
float target_y; /**
* 放手时的x的坐标
*/
float up_x; /**
* 放手时的y的坐标
*/
float up_y; /**
* 当前的弧度(以该 view 的中心为圆点)
*/
float current_degree; /**
* 放手时的弧度(以该 view 的中心为圆点)
*/
float up_degree; /**
* 当前圆盘所转的弧度(以该 view 的中心为圆点)
*/
float deta_degree; /**
* 最后一次手势滑过的时间
*/
double lastMoveTime = 0; /**
* 最小加速度(当手指放手是)
*/
public static final float a_min = 0.001f; /**
* 加速度增量
*/
public static final float a_add = 0.001f; /**
* 加速度
*/
float a = a_min; /**
* 最大加速度(当手指按住时)
*/
public static final float a_max = a_min * 5; /**
* 旋转速度(度/毫秒)
*/
double speed = 0; /**
* 速度计算器
*/
VRecord vRecord; /**
* 是否为顺时针旋转
*/
boolean isClockWise; @Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
if (rotatBitmap == null) { throw new NoBitMapError("Error,No bitmap in RotatView!");
}
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: {
down_x = event.getX();
down_y = event.getY();
current_degree = detaDegree(o_x, o_y, down_x, down_y);
vRecord.reset();
// handler.sendEmptyMessage(stop);
a = a_max; break; }
case MotionEvent.ACTION_MOVE: {
down_x = target_x = event.getX();
down_y = target_y = event.getY();
float degree = detaDegree(o_x, o_y, target_x, target_y); // 滑过的弧度增量
float dete = degree - current_degree;
// 假设小于-90度说明 它跨周了,须要特殊处理350->17,
if (dete < -270) {
dete = dete + 360; // 假设大于90度说明 它跨周了,须要特殊处理-350->-17,
} else if (dete > 270) {
dete = dete - 360;
}
lastMoveTime = System.currentTimeMillis();
vRecord.add(dete, lastMoveTime);
addDegree(dete);
current_degree = degree;
postInvalidate(); break;
}
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP: {
a = a_min; double lastupTime = System.currentTimeMillis();
double detaTime = lastupTime - lastMoveTime;
up_x = event.getX();
up_y = event.getY();
up_degree = detaDegree(o_x, o_y, up_x, up_y);
// 放手时的速度
speed = speed + vRecord.getSpeed();
if (speed > 0) {
speed = Math.min(VRecord.max_speed, speed);
} else {
speed = Math.max(-VRecord.max_speed, speed);
}
// System.out.println("speed:" + speed);
if (speed > 0) {
isClockWise = true;
// v = 1;
} else {
isClockWise = false;
// v = -1;
}
currentTime = System.currentTimeMillis();
handler.sendEmptyMessage(0);
break;
}
}
return true;
} /**
* 计算以(src_x,src_y)为坐标圆点,建立直角体系,求出(target_x,target_y)坐标与x轴的夹角
* 主要是利用反正切函数的知识求出夹角
*
* @param src_x
* @param src_y
* @param target_x
* @param target_y
* @return
*/
float detaDegree(float src_x, float src_y, float target_x, float target_y) { float detaX = target_x - src_x;
float detaY = target_y - src_y;
double d;
if (detaX != 0) {
float tan = Math.abs(detaY / detaX); if (detaX > 0) { if (detaY >= 0) {
d = Math.atan(tan); } else {
d = 2 * Math.PI - Math.atan(tan);
} } else {
if (detaY >= 0) { d = Math.PI - Math.atan(tan);
} else {
d = Math.PI + Math.atan(tan);
}
} } else {
if (detaY > 0) {
d = Math.PI / 2;
} else { d = -Math.PI / 2;
}
} return (float)((d * 180) / Math.PI);
} /**
* 一个异常。用来推断是否有rotatbitmap
*
* @author sun.shine
*/
static class NoBitMapError extends RuntimeException { /**
*
*/
private static final long serialVersionUID = 1L; public NoBitMapError(String detailMessage) {
super(detailMessage);
} } /**
* 速度计算器 原来是将近期的 弧度增量和时间点记录下来,然后<br>
* 通过增量除以总时间求出平均值做为它的即时手势滑过的速度
*
* @author sun.shine
*/
static class VRecord { /**
* 数组中的有效数字
*/
int addCount; /**
* 最大能装的数据空间
*/
public static final int length = 15; /**
* 二维数组,1.保存弧度增量.2.保存产生这个增量的时间点
*/
double[][] record = new double[length][2]; /**
* 为二维数组装载数据<br>
* 注:通过此方法,有个特点,能把最后的length组数据记录下来,length以外的会丢失
*
* @param detadegree
* @param time
*/
public void add(double detadegree, double time) { for (int i = length - 1; i > 0; i--) {
record[i][0] = record[i - 1][0];
record[i][1] = record[i - 1][1];
}
record[0][0] = detadegree;
record[0][1] = time;
addCount++; } /**
* 最大速度
*/
public static final double max_speed = 8; /**
* 通过数组里所装载的数据分析出即时速度<br>
* 原理是:计算数组里的时间长度和增量的总数。然后求出每毫秒所走过的弧度<br>
* 当然不能超过{@link VRecord#max_speed}
*
* @return
*/
public double getSpeed() { if (addCount == 0) {
return 0;
}
int maxIndex = Math.min(addCount, length) - 1; if ((record[0][1] - record[maxIndex][1]) == 0) {
return 0;
} double detaTime = record[0][1] - record[maxIndex][1];
double sumdegree = 0;
for (int i = 0; i < length - 1; i++) { sumdegree += record[i][0];
// System.out.println(record[i][0]);
} // System.out.println("----------");
// System.out.println(sumdegree);
// System.out.println(detaTime);
double result = sumdegree / detaTime;
if (result > 0) {
return Math.min(result, max_speed);
} else {
return Math.max(result, -max_speed);
}
// System.out.println("v=" + result); } /**
* 重置
*/
public void reset() {
addCount = 0;
for (int i = length - 1; i > 0; i--) {
record[i][0] = 0;
record[i][1] = 0;
}
}
} @Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
if(rotatBitmap!=null){
rotatBitmap.recycle();
rotatBitmap=null;
}
}
}
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#ffffffff" > <com.sun.shine.myrotation.view.RotatView
android:id="@+id/myRotatView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dip" >
</com.sun.shine.myrotation.view.RotatView> </RelativeLayout>

android的一些控件的更多相关文章

  1. Android 中常见控件的介绍和使用

    1 TextView文本框 1.1 TextView类的结构 TextView 是用于显示字符串的组件,对于用户来说就是屏幕中一块用于显示文本的区域.TextView类的层次关系如下: java.la ...

  2. Android中ListView控件的使用

    Android中ListView控件的使用 ListView展示数据的原理 在Android中,其实ListView就相当于web中的jsp,Adapter是适配器,它就相当于web中的Servlet ...

  3. 五、Android学习第四天补充——Android的常用控件(转)

    (转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 五.Android学习第四天补充——Android的常用控件 熟悉常用的A ...

  4. 注意Android里TextView控件的一个小坑,用android:theme来设置样式时动态载入的layout会丢失该样式

    注意Android里TextView控件的一个小坑,用android:theme来设置样式时动态载入的layout会丢失该样式 这个坑,必须要注意呀, 比如在用ListView的时候,如果在List_ ...

  5. Android其它新控件 (转)

    原文出处:http://blog.csdn.net/lavor_zl/article/details/51312715 Android其它新控件是指非Android大版本更新时提出的新控件,也非谷歌I ...

  6. Android 之计算控件颜色透明度

    Android 之计算控件颜色透明度 1.UI会给一个数值,例如:#EFE000,透明度30% 2.用255乘以30%等于76.5,然后四舍五入等于77 3.用计算器将十进制的77转成十六进制的数据为 ...

  7. 【转】Android M新控件之AppBarLayout,NavigationView,CoordinatorLayout,CollapsingToolbarLayout的使用

    Android M新控件之AppBarLayout,NavigationView,CoordinatorLayout,CollapsingToolbarLayout的使用 分类: Android UI ...

  8. 【转】Android M新控件之FloatingActionButton,TextInputLayout,Snackbar,TabLayout的使用

    Android M新控件之FloatingActionButton,TextInputLayout,Snackbar,TabLayout的使用 分类: Android UI2015-06-15 16: ...

  9. android中ListView控件&&onItemClick事件中获取listView传递的数据

    http://blog.csdn.net/aben_2005/article/details/6592205 本文转载自:android中ListView控件&&onItemClick ...

  10. 【风马一族_Android】第4章Android常用基本控件

    第4章Android常用基本控件 控件是Android用户界面中的一个个组成元素,在介绍它们之前,读者必须了解所有控件的父类View(视图),它好比一个盛放控件的容器. 4.1View类概述 对于一个 ...

随机推荐

  1. 更改Apache的首页

    本机Apache的安装过程请见: Apache的首页是由/usr/local/httpd/conf/httpd.conf文件的DocumentRoot决定的. ...## DocumentRoot: ...

  2. linux 硬连接与软连接

    1.linux中文件占用一个inode,inode指向文件内容.2.文件名可以认为是一个指针,指向inode.硬连接相当于指针的整体拷贝,并不是对文件内容的拷贝.两个文件名(两个指针)都能修改文件,删 ...

  3. LoadRunner录制:关联

    一般请求中看到 hash strings, random strings, session ID 这种,就需要动态去获取该内容,这样就需要用到关联. 回放时自动关联 1. 录制脚本并执行. 2. 打开 ...

  4. 【React Native开发】React Native控件之ListView组件解说以及最齐全实例(19)

    ),React Native技术交流4群(458982758).请不要反复加群!欢迎各位大牛,React Native技术爱好者加入交流!同一时候博客左側欢迎微信扫描关注订阅号,移动技术干货,精彩文章 ...

  5. Linux 驱动之内核定时器

    1.定时器 之前说过两类跟时间相关的内核结构. 1.延时:通过忙等待或者睡眠机制实现延时. 2.tasklet和工作队列,通过某种机制使工作推后运行,但不知道运行的详细时间. 接下来要介绍的定时器,可 ...

  6. Android 英文文档下载地址

    通过英文Android API学习Android技术是一个不错选择,当然养鸡的专业户要小心了,以下分享一些下载英文文档的链接(请使用迅雷下载): https://dl-ssl.google.com/a ...

  7. HDU 3974 Assign the task(dfs时间戳+线段树成段更新)

    题意:给定点的上下级关系,规定假设给i分配任务a.那么他的全部下属.都停下手上的工作,開始做a. 操作 T x y 分配x任务y,C x询问x的当前任务: Sample Input 1 5 4 3 3 ...

  8. vmwear虚拟机Ubuntu设置桥接(Bridged)

    近期遇上大数据的实验课,须要搭建hadoop的实验环境,所以和舍友组队搭环境,因为感觉双系统没有虚拟机方便,所以我安装的Ubuntu的虚拟机,舍友安装的双系统.可是在将我的Ubuntu虚拟机连接到与舍 ...

  9. SDUT 1157-小鼠迷宫问题(BFS&amp;DFS)

    小鼠迷宫问题 nid=24#time" title="C.C++.go.haskell.lua.pascal Time Limit1500ms Memory Limit 65536 ...

  10. 【Oracle】事务处理

    名词解释 DML:Data Manipulation Language (数据库操纵语言) 例如:DELETE.INSERT.UPDATE.SELECT DDL:Data Definition Lan ...