android自定義手表效果
本文實例為大家分享了android自定義手表效果的具體代碼,供大家參考,具體內(nèi)容如下
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;
/**
* 優(yōu)化方案:
* 表盤課繪制一次
* 在分線程中進行加載
*/
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);
// 內(nèi)層圓 --》圓心
paint.setStyle(Paint.Style.FILL);
canvas.drawCircle(width / 2, height / 2, 10, paint);
// 循環(huán)畫刻度(旋轉(zhuǎn)畫刻度)
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());
}
}
}
點擊運行就可以了,這樣手機就可以當(dāng)手表用了,真的神奇。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android布局技巧之創(chuàng)建可重用的UI組件
這篇文章主要為大家詳細(xì)介紹了Android布局技巧之創(chuàng)建可重用的UI組件,文中提到了include標(biāo)簽的使用方法,感興趣的小伙伴們可以參考一下2016-05-05
Android中Activity跳轉(zhuǎn)的創(chuàng)建步驟總結(jié)
這篇文章主要介紹了Android中Activity跳轉(zhuǎn)的創(chuàng)建步驟總結(jié),本文詳細(xì)的講解了從工程創(chuàng)建到跳轉(zhuǎn)Activity的實現(xiàn)完整過程,需要的朋友可以參考下2014-10-10
android中g(shù)zip數(shù)據(jù)壓縮與網(wǎng)絡(luò)框架解壓縮
這篇文章主要為大家介紹了android中g(shù)zip數(shù)據(jù)壓縮與網(wǎng)絡(luò)框架解壓縮實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-11-11
Android設(shè)備間實現(xiàn)藍牙(Bluetooth)共享上網(wǎng)
這篇文章主要為大家詳細(xì)介紹了Android設(shè)備間實現(xiàn)藍牙(Bluetooth)共享上網(wǎng)的方法,主要以圖片的方式向大家展示藍牙共享上網(wǎng)2016-03-03
Android 使用Gallery實現(xiàn)3D相冊(附效果圖+Demo源碼)
今天主要是說說如何實現(xiàn)Gallery的3D顯示切換,Demo的代碼很多是基于網(wǎng)上一些現(xiàn)成效果,感謝這些分享成果的開發(fā)者2013-07-07
Android實現(xiàn)Service獲取當(dāng)前位置(GPS+基站)的方法
這篇文章主要介紹了Android實現(xiàn)Service獲取當(dāng)前位置(GPS+基站)的方法,較為詳細(xì)的分析了Service基于GPS位置的技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-09-09
Android自定義控件RatingBar調(diào)整字體大小
這篇文章主要為大家詳細(xì)介紹了Android自定義控件RatingBar調(diào)整字體大小的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-03-03

