android 自定义指南针,android 自定义指南针view
这是我第一次在csdn上写文章,因为自己还是个实习生,总感觉实力不够,写不出好文章。做android实习生已经5个多月了,记录一下平时用到的知识。这个指南针view是我在csdn看到原形,感觉很好玩的。然后我自己就动手写这个。效果如下:
下面是自定义view代码:
package com.example.viewlearn;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.view.View;
class CompassView extends View {
private Paint mCirclePaint;//外圆画笔
private Paint mTextPaint;//方位画笔
private Paint mLinepaint;//刻度画笔
private float mDegree = 0f;//指针度
private int mTextHight;//字高
private Paint mDegreePain;//指针度画笔
private Paint mSmallCirclePaint;//内圆画笔
private Paint mSmallerCirclePaint;//最小内圆画笔
private Paint mPointerPaint;//指针画笔
private Paint mBorderPaint;//外圆边框画笔
public CompassView(Context context) {
super(context);
initView();
}
public CompassView(Context context, AttributeSet attrs) {
super(context, attrs);
initView();
}
public CompassView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initView();
}
public float getmDegree() {
return mDegree;
}
public void setmDegree(float mDegree) {
this.mDegree = mDegree;
invalidate();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int width = measure(widthMeasureSpec);
int height = measure(heightMeasureSpec);
int d = Math.min(width, height);
setMeasuredDimension(d, d);
}
protected int measure(int measureSpec){
int size = 0;
int measureMode = MeasureSpec.getMode(measureSpec);
if(measureMode == MeasureSpec.UNSPECIFIED){
size = 250;
}else{
size = MeasureSpec.getSize(measureSpec);
}
return size;
}
protected void initView(){
mBorderPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mBorderPaint.setColor(Color.WHITE);
mCirclePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mCirclePaint.setColor(getResources().getColor(R.color.shape1_color));
mCirclePaint.setAntiAlias(true);
mCirclePaint.setStrokeWidth(2f);
mCirclePaint.setStyle(Style.STROKE);
mTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mTextPaint.setColor(getResources().getColor(R.color.location_color));
mTextPaint.setTextSize(35f);
mTextPaint.setTypeface(Typeface.DEFAULT_BOLD);
mLinepaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mLinepaint.setColor(getResources().getColor(R.color.line_color));
mDegreePain = new Paint(Paint.ANTI_ALIAS_FLAG);
mDegreePain.setColor(getResources().getColor(R.color.degress_color));
mDegreePain.setTextSize(16f);
mSmallCirclePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mSmallCirclePaint.setColor(getResources().getColor(R.color.small_circle_bg));
mSmallerCirclePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mSmallerCirclePaint.setColor(Color.WHITE);
mPointerPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPointerPaint.setColor(getResources().getColor(R.color.pointer_color));
mPointerPaint.setStrokeWidth(2f);
mTextHight = (int) mLinepaint.measureText("NN");
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
int px = getMeasuredWidth()/2;
int py = getMeasuredHeight()/2;
int radius = Math.min(px, py);
int smallRadius = (int)(radius * 0.5);
int smallerRadius =(int)(radius * 0.2);
canvas.drawCircle(px, py, radius,mBorderPaint);//外圆边框
canvas.drawCircle(px, py, radius,mCirclePaint);//外圆
canvas.drawCircle(px, py, smallRadius,mSmallCirclePaint);//小圆
canvas.drawCircle(px, py, smallerRadius,mSmallerCirclePaint);//最小圆
canvas.drawText(String.valueOf((int)mDegree)+"°", px-mTextHight*2, py+mTextHight, mTextPaint);//指针度数
canvas.save();
canvas.rotate(-mDegree, px, py);
for(int i = 0;i<24;i++){
int linePy = py-radius+(radius/20);
int textPy = linePy + mTextHight+10;
canvas.drawLine(px, py - radius, px, linePy, mLinepaint);//短刻度
canvas.save();
if (i % 6 == 0) {
String location = null;
switch (i) {
case 0:
location = "N";
canvas.drawLine(px, py-smallRadius, px, textPy+20, mPointerPaint);//指针
canvas.drawLine(px, py-mTextHight, px, py-smallerRadius, mPointerPaint);//指针
break;
case 6:
location = "W";
break;
case 12:
location = "S";
break;
case 18:
location = "E";
break;
}
canvas.drawLine(px, py - radius, px, linePy*2, mLinepaint);//长刻度
canvas.drawText(location, px-mTextHight/2-6, textPy+15, mTextPaint);//方位
}else if(i%3 == 0){
canvas.drawText(String.valueOf(i*15), px-mTextHight, textPy, mDegreePain);//刻度文字
}
canvas.restore();
canvas.rotate(-15, px, py);
}
canvas.restore();
}
}
因为只是demo,我偷懒没有自定义方位的enum。
下面是Activity代码:
package com.example.viewlearn;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.TextView;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
public class MainActivity extends Activity {
private CompassView mCompassView;
private SensorManager mSensorManager;
private TextView mPositionView;
private SensorListener mListener = new SensorListener();
@SuppressLint("HandlerLeak")
private Handler mHandler = new Handler(){
public void handleMessage(Message msg) {
Position position = (Position) msg.obj;
mCompassView.setmDegree(position.getDegree());
mPositionView.setText(position.getPositionStr());
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mSensorManager = (SensorManager) this.getSystemService(Context.SENSOR_SERVICE);
mCompassView = (CompassView) this.findViewById(R.id.view_compass);
mPositionView = (TextView) this.findViewById(R.id.position);
}
@Override
protected void onResume() {
Sensor sensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
mSensorManager.registerListener(mListener,sensor,SensorManager.SENSOR_DELAY_GAME);
super.onResume();
}
@Override
protected void onPause() {
mSensorManager.unregisterListener(mListener);
super.onPause();
}
public class SensorListener implements SensorEventListener{
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
@Override
public void onSensorChanged(SensorEvent event) {
float degree = event.values[0];
String positionstr = null;
if (22.5 >= degree || degree >= 337.5) {
positionstr = "N";
} else if (22.5 < degree && degree <= 67.5) {
positionstr = "NE";
} else if (67.5 < degree && degree <= 112.5) {
positionstr = "E";
} else if (112.5 < degree && degree <= 157.5) {
positionstr = "SE";
} else if (157.5 < degree && degree <= 202.5) {
positionstr = "S";
} else if (202.5 < degree && degree <= 247.5) {
positionstr = "SW";
} else if (247.5 < degree && degree <= 292.5) {
positionstr = "W";
}else if(292.5
positionstr = "NW";
}
Message msg = mHandler.obtainMessage();
msg.obj = new Position(degree, positionstr);
msg.sendToTarget();
}
}
}
android 自定义指南针,android 自定义指南针view相关推荐
- arcgis android 指南针,Arcgis runtime for Android 100.5 (六) 自定义指南针
Arcgis没有提供指南针控件,如果需要,可以自定义一个,很简单 去阿里图标库下载一个能用的指南针如 指南针 放置在布局文件中 xmlns:fab="http://schemas.andro ...
- android炫酷的自定义view,Android自定义View实现炫酷进度条
本文实例为大家分享了Android实现炫酷进度条的具体代码,供大家参考,具体内容如下 下面我们来实现如下效果: 第一步:创建attrs文件夹,自定义属性: 第二步:自定义View: /** * Cre ...
- android sqlite自定义函数,Android中自定义一个View的方法详解
本文实例讲述了Android中自定义一个View的方法.分享给大家供大家参考,具体如下: Android中自定义View的实现比较简单,无非就是继承父类,然后重载方法,即便如此,在实际编码中难免会遇到 ...
- Android Paint应用之自定义View实现进度条控件
在上一篇文章<Android神笔之Paint>学习了Paint的基本用法,但是具体的应用我们还没有实践过.从标题中可知,本文是带领读者使用Paint,自定义一个进度条控件. 上图就是本文要 ...
- 【Android 应用开发】自定义View 和 ViewGroup
一. 自定义View介绍 自定义View时, 继承View基类, 并实现其中的一些方法. (1) ~ (2) 方法与构造相关 (3) ~ (5) 方法与组件大小位置相关 (6) ~ (9) 方法与触摸 ...
- Android开发-将自定义View布局到Layout中并调用
写程序的时候,关于布局方面遇到并解决的问题 1.自定义View及其layout属性. 自定义View: [java] view plaincopy public class DrawView exte ...
- Android 高手进阶之自定义View,自定义属性(带进度的圆形进度条)
转载请注明地址:http://blog.csdn.net/xiaanming/article/details/10298163 很多的时候,系统自带的View满足不了我们功能的需求,那么我们就需要自己 ...
- Android 自定义 圆环,Android自定义view实现圆环效果实例代码
先上效果图,如果大家感觉不错,请参考实现代码. 重要的是如何实现自定义的view效果 (1)创建类,继承view,重写onDraw和onMesure方法 public class CirclePerc ...
- android自定义抽奖,Android自定义view制作抽奖转盘
本文实例为大家分享了Android自定义view制作抽奖转盘的具体代码,供大家参考,具体内容如下 效果图 TurntableActivity package com.bawei.myapplicati ...
- android java 圆角_Android自定义View实现带4圆角或者2圆角的效果
1 问题 实现任意view经过自定义带4圆角或者2圆角的效果 2 原理 1) 实现view 4圆角 我们只需要把左边的图嵌入到右边里面去,最终显示左边的图就行. 2) 实现view上2圆角 我们只需要 ...
最新文章
- 成天说要删库跑路,这次真的有人干了
- 今年的谷歌I/O大会,或许会有这些东西
- 让你的eclipse插件只下载一次
- 网页文字对齐(CSS)
- Leetcode 260. 只出现一次的数字 III 解题思路及C++实现
- 用python读取stata文件及写入and注意事项
- 用eval在txt中存储list,dict,tuple
- mysql协议重传,MySQL · 源码分析 · 网络通信模块浅析
- java wait 释放锁_JAVA锁之wait,notify(wait会释放锁,notify仅仅只是通知,不释放锁)...
- 轴只显示5个刻度_告别大象腿,迎接魅力美腿,变身女王你只需5个方法
- Microsoft SQL Server Compact 4.0ADO.NET Entity Framework 4.1MVC3
- SQL 使用总结一( 规范、基础)
- python进程池和线程池_python自带的进程池及线程池
- mysql有没有开窗函数_mysql实现开窗函数
- cidaemon.exe进程cpu使用率100%
- moveit缺少libfcl.so.0.6文件
- 苹果V10附件参数配置
- iOS基础:获取资源文件的方法
- 一拖再拖,刁肥宅个人主页终上线!
- 别让自己 “墙” 了自己
热门文章
- 阿里巴巴的安全能力究竟是什么水平?
- .Net FW上线报错:The OwinStartup attribute discovered in assembly ‘AppName‘.
- linux c第四天———gcc、gdb、指针、大小端存储
- 服务器 uefi 安装win7系统,uefi安装win7_efi引导gpt安装win7教程
- HDU 3533 Escape(BFS)
- Java实现:挖金矿问题
- Python3 语音识别谷歌验证码
- FastDB使用记录
- TOM163vip邮箱靓号注册,域名邮箱如何注册
- Priceline拥有五个子品牌分别是:Booking.com、Priceline.com、Agoda、Kayak 以及Rentalcars