android自定义手表效果
时间:2022-07-27
本文章向大家介绍android自定义手表效果,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
本文实例为大家分享了android自定义手表效果的具体代码,供大家参考,具体内容如下
1.效果图:
2.布局
<?xml version="1.0" encoding="utf-8"?
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
<Button
android:id="@+id/btn_start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="start" /
.
<Button
android:id="@+id/btn_stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="stop" /
<ImageView
android:id="@+id/iv_clock"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:src="@mipmap/ic_launcher" /
</LinearLayout
3.自定义view,显示
package com.example.administrator.testz;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import java.util.Calendar;
/**
* 优化方案:
* 表盘课绘制一次
* 在分线程中进行加载
*/
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button btnStart, btnStop;
private ImageView mClockImageView;
Bitmap.Config config = Bitmap.Config.ARGB_8888;
int width = 500;
int height = 500;
private Calendar mCalendar;
private int mHour, mMinute, mSecond;
private float mDegrees;
private float length;
private boolean mIsRunning;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnStart = (Button) findViewById(R.id.btn_start);
btnStop = (Button) findViewById(R.id.btn_stop);
btnStop.setOnClickListener(this);
btnStart.setOnClickListener(this);
mClockImageView = (ImageView) findViewById(R.id.iv_clock);
mClockImageView.setImageBitmap(drawClock());
}
/**
* 画表盘
*/
private Bitmap drawClockFace() {
Bitmap bm = Bitmap.createBitmap(width, height, config);
Canvas canvas = new Canvas(bm);
Paint paint = new Paint();
paint.setAntiAlias(true); //锯齿
paint.setStyle(Paint.Style.STROKE); // 空心
paint.setStrokeWidth(5);
paint.setColor(Color.parseColor("#333333"));
// 外层圆
canvas.drawCircle(width / 2, height / 2, width / 2, paint);
// 內层圆 --》圆心
paint.setStyle(Paint.Style.FILL);
canvas.drawCircle(width / 2, height / 2, 10, paint);
// 循环画刻度(旋转画刻度)
for (int i = 0; i < 12; i++) {
if (i % 3 == 0) {
paint.setStrokeWidth(10);
canvas.drawLine(width / 2, 0, width / 2, 24, paint);
canvas.rotate(30, width / 2, height / 2);
} else {
canvas.drawLine(width / 2, 0, width / 2, 10, paint);
canvas.rotate(30, width / 2, height / 2);
}
}
return bm;
}
private Bitmap drawClock() {
Bitmap bm = drawClockFace();
Canvas canvas = new Canvas(bm);
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setColor(Color.parseColor("#333333"));
mCalendar = Calendar.getInstance();
mHour = mCalendar.get(Calendar.HOUR);
mMinute = mCalendar.get(Calendar.MINUTE);
mSecond = mCalendar.get(Calendar.SECOND);
//画小时指针
paint.setStrokeWidth(10);
mDegrees = mHour * 30 + mMinute / 2;
length = (width / 2) * 0.7f;
canvas.save();
canvas.rotate(mDegrees, width / 2, height / 2);
canvas.drawLine(width / 2, height / 2, width / 2, height - (height / 2) - length, paint);
canvas.restore();
// canvas.rotate(360 - mDegrees, width / 2, height / 2);
//画分钟指针
paint.setStrokeWidth(4);
mDegrees = mMinute * 6 + mSecond / 10;
length = (width / 2) * 0.78f;
canvas.save();
canvas.rotate(mDegrees, width / 2, height / 2);
canvas.drawLine(width / 2, height / 2, width / 2, height - (height / 2) - length, paint);
canvas.restore();
// canvas.rotate(360 - mDegrees, width / 2, height / 2);
//画分钟指针
paint.setStrokeWidth(2);
mDegrees = mSecond * 6;
length = (width / 2) * 0.92f;
canvas.save();
canvas.rotate(mDegrees, width / 2, height / 2);
canvas.drawLine(width / 2, height / 2, width / 2, height - (height / 2) - length, paint);
canvas.restore();
return bm;
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_start:
mIsRunning = true;
new ClockTask().execute("");
break;
case R.id.btn_stop:
mIsRunning = false;
break;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
mIsRunning = false;
}
private class ClockTask extends AsyncTask<Object, Object, Object {
@Override
protected Object doInBackground(Object... objects) {
while (mIsRunning) {
publishProgress("");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return null;
}
@Override
protected void onProgressUpdate(Object... values) {
super.onProgressUpdate(values);
mClockImageView.setImageBitmap(drawClock());
}
}
}
点击运行就可以了,这样手机就可以当手表用了,真的神奇。
以上就是本文的全部内容,希望对大家的学习有所帮助。
- android自定义listview实现header悬浮框效果
- 关于TCP 半连接队列和全连接队列
- 使用LogParser分析日志
- T-SQL基础--TOP
- 自创数据集,用TensorFlow预测股票教程 !(附代码)
- 介绍几个好用的android自定义控件
- T-SQL—理解CTEs
- SQL 扩展事件
- ShapeDrawable做放大镜效果
- android放大镜效果实现
- Android StringEntity() 和 UrlEncodedFormEntity() 的区别
- 如何根据日志查看删除的数据(转译)
- 具体问题解决:分离脚本
- 独家 | 手把手教你用Python 3创建用于机器学习开发的Linux虚拟机(附安装教程、代码)
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 5.02-requests_proxy
- 5.03-requests_ssl
- 5.04-requests_cookies
- 通过 Node.js 小示例学习浏览器缓存策略
- [未解决]报错: execjs._exceptions.ProgramError: TypeError: Cannot read property 'extend' of undefined
- 5.05-requests_cookies2
- 5.06-re
- Python3爬虫 利用百度地图api得到城市经纬度
- [未解决]报错: pytesseract.pytesseract.TesseractNotFoundError: tesseract is not installed or it's not in y
- 6.01-re-split_chinese
- Mac上安装tesseract-OCR
- 6.02-news_re
- 6.03-news_xpath2
- 修改mysql密码
- 6.04-news_xpath3