这是我第一次在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相关推荐

  1. arcgis android 指南针,Arcgis runtime for Android 100.5 (六) 自定义指南针

    Arcgis没有提供指南针控件,如果需要,可以自定义一个,很简单 去阿里图标库下载一个能用的指南针如 指南针 放置在布局文件中 xmlns:fab="http://schemas.andro ...

  2. android炫酷的自定义view,Android自定义View实现炫酷进度条

    本文实例为大家分享了Android实现炫酷进度条的具体代码,供大家参考,具体内容如下 下面我们来实现如下效果: 第一步:创建attrs文件夹,自定义属性: 第二步:自定义View: /** * Cre ...

  3. android sqlite自定义函数,Android中自定义一个View的方法详解

    本文实例讲述了Android中自定义一个View的方法.分享给大家供大家参考,具体如下: Android中自定义View的实现比较简单,无非就是继承父类,然后重载方法,即便如此,在实际编码中难免会遇到 ...

  4. Android Paint应用之自定义View实现进度条控件

    在上一篇文章<Android神笔之Paint>学习了Paint的基本用法,但是具体的应用我们还没有实践过.从标题中可知,本文是带领读者使用Paint,自定义一个进度条控件. 上图就是本文要 ...

  5. 【Android 应用开发】自定义View 和 ViewGroup

    一. 自定义View介绍 自定义View时, 继承View基类, 并实现其中的一些方法. (1) ~ (2) 方法与构造相关 (3) ~ (5) 方法与组件大小位置相关 (6) ~ (9) 方法与触摸 ...

  6. Android开发-将自定义View布局到Layout中并调用

    写程序的时候,关于布局方面遇到并解决的问题 1.自定义View及其layout属性. 自定义View: [java] view plaincopy public class DrawView exte ...

  7. Android 高手进阶之自定义View,自定义属性(带进度的圆形进度条)

    转载请注明地址:http://blog.csdn.net/xiaanming/article/details/10298163 很多的时候,系统自带的View满足不了我们功能的需求,那么我们就需要自己 ...

  8. Android 自定义 圆环,Android自定义view实现圆环效果实例代码

    先上效果图,如果大家感觉不错,请参考实现代码. 重要的是如何实现自定义的view效果 (1)创建类,继承view,重写onDraw和onMesure方法 public class CirclePerc ...

  9. android自定义抽奖,Android自定义view制作抽奖转盘

    本文实例为大家分享了Android自定义view制作抽奖转盘的具体代码,供大家参考,具体内容如下 效果图 TurntableActivity package com.bawei.myapplicati ...

  10. android java 圆角_Android自定义View实现带4圆角或者2圆角的效果

    1 问题 实现任意view经过自定义带4圆角或者2圆角的效果 2 原理 1) 实现view 4圆角 我们只需要把左边的图嵌入到右边里面去,最终显示左边的图就行. 2) 实现view上2圆角 我们只需要 ...

最新文章

  1. 成天说要删库跑路,这次真的有人干了
  2. 今年的谷歌I/O大会,或许会有这些东西
  3. 让你的eclipse插件只下载一次
  4. 网页文字对齐(CSS)
  5. Leetcode 260. 只出现一次的数字 III 解题思路及C++实现
  6. 用python读取stata文件及写入and注意事项
  7. 用eval在txt中存储list,dict,tuple
  8. mysql协议重传,MySQL · 源码分析 · 网络通信模块浅析
  9. java wait 释放锁_JAVA锁之wait,notify(wait会释放锁,notify仅仅只是通知,不释放锁)...
  10. 轴只显示5个刻度_告别大象腿,迎接魅力美腿,变身女王你只需5个方法
  11. Microsoft SQL Server Compact 4.0ADO.NET Entity Framework 4.1MVC3
  12. SQL 使用总结一( 规范、基础)
  13. python进程池和线程池_python自带的进程池及线程池
  14. mysql有没有开窗函数_mysql实现开窗函数
  15. cidaemon.exe进程cpu使用率100%
  16. moveit缺少libfcl.so.0.6文件
  17. 苹果V10附件参数配置
  18. iOS基础:获取资源文件的方法
  19. 一拖再拖,刁肥宅个人主页终上线!
  20. 别让自己 “墙” 了自己

热门文章

  1. 阿里巴巴的安全能力究竟是什么水平?
  2. .Net FW上线报错:The OwinStartup attribute discovered in assembly ‘AppName‘.
  3. linux c第四天———gcc、gdb、指针、大小端存储
  4. 服务器 uefi 安装win7系统,uefi安装win7_efi引导gpt安装win7教程
  5. HDU 3533 Escape(BFS)
  6. Java实现:挖金矿问题
  7. Python3 语音识别谷歌验证码
  8. FastDB使用记录
  9. TOM163vip邮箱靓号注册,域名邮箱如何注册
  10. Priceline拥有五个子品牌分别是:Booking.com、Priceline.com、Agoda、Kayak 以及Rentalcars