Android仿小米指南针功能
龙旋
共 9330字,需浏览 19分钟
· 2021-05-14
效果图:
实现步骤:
1、第一步新建一个calss,就起名叫Mi吧。一会用来绘制自定义View
颜色样式colors.xml的文件
<resources>
<color name="colorPrimary">#3F51B5</color>
<color name="colorPrimaryDark">#303F9F</color>
<color name="colorAccent">#FF4081</color>
<color name="black">#000</color>
<color name="darkRed">#702216</color>
<color name="lightGray">#323232</color>
<color name="deepGray">#8B8B8B</color>
<color name="white">#fff</color>
<color name="red">#f00</color>
<color name="ocbg">#237EAD</color>
</resources>
画指南针外圈
/**
* 指南针外部可简单分为两部分
* 1、用Path实现小三角形
* 2、两个圆弧
*/
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
private void drawCompassOutSide() {
mCanvas.save();
//小三角形的高度
int mTriangleHeight=40;
//定义Path画小三角形
mOutsideTriangle.moveTo(width/2,mTextHeight-mTriangleHeight);
//小三角形的边长
float mTriangleSide = 46.18f;
//画出小三角形
mOutsideTriangle.lineTo(width/2-mTriangleSide/2,mTextHeight);
mOutsideTriangle.lineTo(width/2+mTriangleSide/2,mTextHeight);
mOutsideTriangle.close();
mCanvas.drawPath(mOutsideTriangle,mOutSideCircumPaint);
//画圆弧
mDarkRedPaint.setStrokeWidth((float) 5);
mLightGrayPaint.setStrokeWidth((float)5);
mDeepGrayPaint.setStrokeWidth((float)3);
mLightGrayPaint.setStyle(Paint.Style.STROKE);
mCanvas.drawArc(width/2-mOutSideRadius,mTextHeight,width/2+mOutSideRadius,mTextHeight+mOutSideRadius*2,-80,120,false,mLightGrayPaint);
mCanvas.drawArc(width/2-mOutSideRadius,mTextHeight,width/2+mOutSideRadius,mTextHeight+mOutSideRadius*2,40,20,false,mDeepGrayPaint);
mCanvas.drawArc(width/2-mOutSideRadius,mTextHeight,width/2+mOutSideRadius,mTextHeight+mOutSideRadius*2,-100,-20,false,mLightGrayPaint);
mCanvas.drawArc(width/2-mOutSideRadius,mTextHeight,width/2+mOutSideRadius,mTextHeight+mOutSideRadius*2,-120,-120,false,mDarkRedPaint);
mCanvas.restore();
}
画指南针外接圆
/**
* 指南针外接圆,和外部圆换道理差不多
*/
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
private void drawCompassCircum() {
mCanvas.save();
//外接圆小三角形的高度
int mTriangleHeight=(mOutSideRadius-mCircumRadius)/2;
mCanvas.rotate(-val,width/2,mOutSideRadius+mTextHeight);
mCircumTriangle.moveTo(width/2,mTriangleHeight+mTextHeight);
//内接三角形的边长,简单数学运算
float mTriangleSide = (float) ((mTriangleHeight/(Math.sqrt(3)))*2);
mCircumTriangle.lineTo(width/2-mTriangleSide/2,mTextHeight+mTriangleHeight*2);
mCircumTriangle.lineTo(width/2+mTriangleSide/2,mTextHeight+mTriangleHeight*2);
mCircumTriangle.close();
mCanvas.drawPath(mCircumTriangle,mCircumPaint);
mCanvas.drawArc(width/2-mCircumRadius,mTextHeight+mOutSideRadius-mCircumRadius,
width/2+mCircumRadius,mTextHeight+mOutSideRadius+mCircumRadius,-85,350,false,mDeepGrayPaint);
mAnglePaint.setStrokeWidth(5f);
if (val<=180){
valCompare = val;
mCanvas.drawArc(width/2-mCircumRadius,mTextHeight+mOutSideRadius-mCircumRadius,
width/2+mCircumRadius,mTextHeight+mOutSideRadius+mCircumRadius,-85,valCompare,false,mAnglePaint);
}else{
valCompare = 360-val;
mCanvas.drawArc(width/2-mCircumRadius,mTextHeight+mOutSideRadius-mCircumRadius,
width/2+mCircumRadius,mTextHeight+mOutSideRadius+mCircumRadius,-95,-valCompare,false,mAnglePaint);
}
mCanvas.restore();
}
画内部渐变颜色圆
private void drawInnerCricle() {
mInnerShader = new RadialGradient(width/2,mOutSideRadius+mTextHeight,mCircumRadius-40, Color.parseColor("#323232"),
Color.parseColor("#000000"),Shader.TileMode.CLAMP);
mInnerPaint.setShader(mInnerShader);
mCanvas.drawCircle(width/2,mOutSideRadius+mTextHeight,mCircumRadius-40,mInnerPaint);
}
画指南针内部刻度
private void drawCompassDegreeScale() {
mCanvas.save();
//获取N文字的宽度
mNorthPaint.getTextBounds("N",0,1,mPositionRect);
int mPositionTextWidth = mPositionRect.width();
int mPositionTextHeight = mPositionRect.height();
//获取W文字宽度,因为W比较宽 所以要单独获取
mNorthPaint.getTextBounds("W",0,1,mPositionRect);
int mWPositionTextWidth = mPositionRect.width();
int mWPositionTextHeight = mPositionRect.height();
//获取小刻度,两位数的宽度
mSamllDegreePaint.getTextBounds("30",0,1,mSencondRect);
int mSencondTextWidth = mSencondRect.width();
int mSencondTextHeight = mSencondRect.height();
//获取小刻度,3位数的宽度
mSamllDegreePaint.getTextBounds("30",0,1,mThirdRect);
int mThirdTextWidth = mThirdRect.width();
int mThirdTextHeight = mThirdRect.height();
mCanvas.rotate(-val,width/2,mOutSideRadius+mTextHeight);
//画刻度线
for (int i = 0; i < 240; i++) {
if (i==0||i==60||i==120||i==180){
mCanvas.drawLine(getWidth() / 2, mTextHeight+mOutSideRadius-mCircumRadius+10,
getWidth() / 2, mTextHeight+mOutSideRadius-mCircumRadius+30, mDeepGrayPaint);
}else{
mCanvas.drawLine(getWidth() / 2, mTextHeight+mOutSideRadius-mCircumRadius+10,
getWidth() / 2, mTextHeight+mOutSideRadius-mCircumRadius+30, mLightGrayPaint);
}
if (i==0){
mCanvas.drawText("N", this.width /2-mPositionTextWidth/2,mTextHeight+mOutSideRadius-mCircumRadius+40+mPositionTextHeight,mNorthPaint);
}else if (i==60){
mCanvas.drawText("E", this.width /2-mPositionTextWidth/2,mTextHeight+mOutSideRadius-mCircumRadius+40+mPositionTextHeight,mOthersPaint);
}else if (i==120){
mCanvas.drawText("S", this.width /2-mPositionTextWidth/2,mTextHeight+mOutSideRadius-mCircumRadius+40+mPositionTextHeight,mOthersPaint);
}else if (i==180){
mCanvas.drawText("W", this.width /2-mWPositionTextWidth/2,mTextHeight+mOutSideRadius-mCircumRadius+40+mWPositionTextHeight,mOthersPaint);
}else if (i==20){
mCanvas.drawText("30", this.width /2-mSencondTextWidth/2,mTextHeight+mOutSideRadius-mCircumRadius+40+mSencondTextHeight,mSamllDegreePaint);
}else if (i==40){
mCanvas.drawText("60", this.width /2-mSencondTextWidth/2,mTextHeight+mOutSideRadius-mCircumRadius+40+mSencondTextHeight,mSamllDegreePaint);
}else if (i==80){
mCanvas.drawText("120", this.width /2-mThirdTextWidth/2,mTextHeight+mOutSideRadius-mCircumRadius+40+mThirdTextHeight,mSamllDegreePaint);
}else if (i==100){
mCanvas.drawText("150", this.width /2-mThirdTextWidth/2,mTextHeight+mOutSideRadius-mCircumRadius+40+mThirdTextHeight,mSamllDegreePaint);
}else if (i==140){
mCanvas.drawText("210", this.width /2-mThirdTextWidth/2,mTextHeight+mOutSideRadius-mCircumRadius+40+mThirdTextHeight,mSamllDegreePaint);
}else if (i==160){
mCanvas.drawText("240", this.width /2-mThirdTextWidth/2,mTextHeight+mOutSideRadius-mCircumRadius+40+mThirdTextHeight,mSamllDegreePaint);
}else if (i==200){
mCanvas.drawText("300", this.width /2-mThirdTextWidth/2,mTextHeight+mOutSideRadius-mCircumRadius+40+mThirdTextHeight,mSamllDegreePaint);
}else if (i==220){
mCanvas.drawText("330", this.width /2-mThirdTextWidth/2,mTextHeight+mOutSideRadius-mCircumRadius+40+mThirdTextHeight,mSamllDegreePaint);
}
mCanvas.rotate(1.5f, mCenterX, mOutSideRadius+mTextHeight);
}
mCanvas.restore();
}
2、在xml文件中使用自定义控件
<com.example.customviewdemo.Mi
android:id="@+id/miui"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/black" />
3、写调用方向传感器的代码
public class MainActivity extends AppCompatActivity {
private SensorManager sensorManager;
private SensorEventListener sensorEventListener;
private Mi miui;
private float val;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
miui = findViewById(R.id.miui);
//传感器
sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
//传感器监听
sensorEventListener = new SensorEventListener() {
public void onSensorChanged(SensorEvent event) {
val = event.values[0];
miui.setVal(val);
}
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
};
//注册传感器服务
sensorManager.registerListener(sensorEventListener, sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),
SensorManager.SENSOR_DELAY_GAME);
}
protected void onDestroy() {
super.onDestroy();
//取消注册传感器服务
sensorManager.unregisterListener(sensorEventListener);
}
}
到这里就介绍完了,需要完整源码的童鞋可以在【龙旋】对话框发送【小米指南针】即能获取。
评论
Go 1.22 的新增功能系列之二:reflect.TypeFor
Go 1.22 的第一个候选版本已经发布,这意味着最终版本即将发布,现在是我在博客中介绍我在这个周期中所做工作的时候了。像往常一样,我的贡献很小,但它们是我的,所以我将从幕后的角度来谈谈它们。首先是reflect.TypeFor。这是整个函数:// TypeFor returns the [Type
GoCN
0
SpringBoot 实现图片防盗链功能
程序员的成长之路互联网/程序员/技术/资料共享 关注阅读本文大概需要 4 分钟。来自:blog.csdn.net/weixin_46157208/article/details/138051737前言出于安全考虑,我们需要后端返回的图片只允许在某个网站内展示,不想被爬虫拿到图片地
程序员的成长之路
0
Go 1.22 的新增功能系列之一:cmp.Or
截至撰写本文时,Go 1.22 已经发布几个月了。早就该结束我为 1.22 所做的工作的系列了。抱歉耽搁了这么久,我最近忙于生活事务。如果您错过了我关于reflect.TypeFor(https://blog.carlana.net/post/2024/golang-reflect-type-for
GoCN
1
21.3K star!推荐一款可视化自动化测试/爬虫/数据采集神器!功能免费且强大!
【温馨提示】由于公众号更改了推送规则,不再按照时间顺序排列,如果不想错过测试开发技术精心准备的的干货文章,请将测试开发技术设为“星标☆”,看完文章在文尾处点亮“在看”!大家好,我是狂师!在大数据时代,信息的获取与分析变得尤为重要。对于开发者、数据分析师乃至非技术人员来说,能够高效地采集网络数据并进行
测试开发技术
4
知乎高问:程序员有必要知道为什么做某个功能吗?
将Python客栈设为“星标⭐”第一时间收到最新资讯前言知乎上有一个提问:程序员有必要知道为什么做某个功能吗?↓↓↓今天,我们就这个话题一起来做个讨论。不知道程序员的你,在接到产品经理提的一个需求后,是习惯马上动手开始撸代码呢?还是会先暂停一下,认真思考一会如下一些问题,比如这个需求产生的背景是什么
Python客栈
0
周鸿祎:雷军说小米SU7不适合我,等小米做SUV时再推荐
360公司创始人周鸿祎在互联网30周年座谈会上向雷军提出想要体验小米SU7的请求,但被雷军婉拒。雷军给出的理由是,他仔细研究了周鸿祎的选车标准,发现周鸿祎不会开车,只坐后座,而小米SU7是为追求驾驶乐趣的用户设计的,因此不适合周鸿祎。雷军还表示,等到小米推出SUV版本时,再推荐给周鸿祎。目前已知明确
Python涨薪研究所
0
华为新机秒空,压力给到苹果小米
华为回归又过一关,市场竞争再添变数。冲击万店,汉堡界能跑出下一个蜜雪冰城吗?现在的手机市场,很少对一款手机有这么高的热情。吊足市场胃口的华为Pura 70系列,终于在4月18日揭开面纱,和华为Mate 60系列一样,依然是“未发先售”,突击上市,让市场猝不及防。华为Pura 70系列分四个版本,其中
亿欧网
0
微信9.0快了,网友最期待的功能是这些
将Python客栈设为“星标⭐”第一时间收到最新资讯来源:电脑报编辑:cc你还记得距离微信推送 8.0 版本过去多久了吗?整整三年过去,微信还停留在以 8.0 为前缀的版本上,微信 9.0 迟迟不现身。今年初,官方表示微信 9.0 的更新计划快了,“就在最近”,提升了大家对这个全新版本的期待,看来今
Python客栈
0