[源码]-指南针

本人用的是的soso地图,以前版本(1.7)发现默认是有指南针的,但是升级成最新事,在界面发现有一个指针的东西,但是用过之后,发现它指的方向也不是正北(注意,指南针一般指针所指方向为正北),而且在转动方向的时候,这个指针还一会指东一会儿指西,由时准备自已写一个功能简单的指南针(只指示正北功能)

写成后的界面如下

package com.nt.compass;

import android.content.Context;
import android.graphics.*;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.view.View;

public class ActivityMain extends GraphicsActivity {

	private SensorManager mSensorManager;
	private Sensor mSensor;
	private SampleView mView;
	private float[] mValues;

	private final SensorEventListener mListener = new SensorEventListener() {
		public void onSensorChanged(SensorEvent event) {
			mValues = event.values;
			if (mView != null) {
				mView.invalidate();
			}
		}

		public void onAccuracyChanged(Sensor sensor, int accuracy) {
		}
	};

	@SuppressWarnings("deprecation")
	@Override
	protected void onCreate(Bundle icicle) {
		super.onCreate(icicle);
		mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
		mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
		mView = new SampleView(this);
		setContentView(mView);
	}

	@Override
	protected void onResume() {
		super.onResume();

		mSensorManager.registerListener(mListener, mSensor,
				SensorManager.SENSOR_DELAY_GAME);
	}

	@Override
	protected void onStop() {
		mSensorManager.unregisterListener(mListener);
		super.onStop();
	}

	private class SampleView extends View {
		private Paint mPaint = new Paint();
		private Path mPath = new Path();

		public SampleView(Context context) {
			super(context);

			mPath.moveTo(0, -50);
			mPath.lineTo(-20, 60);
			mPath.lineTo(0, 50);
			mPath.lineTo(20, 60);
			mPath.close();
		}

		@Override
		protected void onDraw(Canvas canvas) {
			Paint paint = mPaint;

			canvas.drawColor(Color.WHITE);

			paint.setAntiAlias(true);
			paint.setColor(Color.BLACK);
			paint.setStyle(Paint.Style.FILL);

			int w = canvas.getWidth();
			int h = canvas.getHeight();
			int cx = w / 2;
			int cy = h / 2;

			canvas.translate(cx, cy);
			if (mValues != null) {
				canvas.rotate(-mValues[0]);
			}
			canvas.drawPath(mPath, mPaint);
		}

		@Override
		protected void onAttachedToWindow() {
			super.onAttachedToWindow();
		}

		@Override
		protected void onDetachedFromWindow() {
			super.onDetachedFromWindow();
		}
	}
}

package com.nt.compass;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;

class GraphicsActivity extends Activity {
    private static final boolean TEST_PICTURE = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public void setContentView(View view) {
        if (TEST_PICTURE) {
            ViewGroup vg = new PictureLayout(this);
            vg.addView(view);
            view = vg;
        }

        super.setContentView(view);
    }
}

package com.nt.compass;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Picture;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;

public class PictureLayout extends ViewGroup {
	private final Picture mPicture = new Picture();

	public PictureLayout(Context context) {
		super(context);
	}

	public PictureLayout(Context context, AttributeSet attrs) {
		super(context, attrs);
	}

	@Override
	public void addView(View child) {
		if (getChildCount() > 1) {
			throw new IllegalStateException(
					"PictureLayout can host only one direct child");
		}

		super.addView(child);
	}

	@Override
	public void addView(View child, int index) {
		if (getChildCount() > 1) {
			throw new IllegalStateException(
					"PictureLayout can host only one direct child");
		}

		super.addView(child, index);
	}

	@Override
	public void addView(View child, LayoutParams params) {
		if (getChildCount() > 1) {
			throw new IllegalStateException(
					"PictureLayout can host only one direct child");
		}

		super.addView(child, params);
	}

	@Override
	public void addView(View child, int index, LayoutParams params) {
		if (getChildCount() > 1) {
			throw new IllegalStateException(
					"PictureLayout can host only one direct child");
		}

		super.addView(child, index, params);
	}

	@Override
	protected LayoutParams generateDefaultLayoutParams() {
		return new LayoutParams(LayoutParams.MATCH_PARENT,
				LayoutParams.MATCH_PARENT);
	}

	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		final int count = getChildCount();

		int maxHeight = 0;
		int maxWidth = 0;

		for (int i = 0; i < count; i++) {
			final View child = getChildAt(i);
			if (child.getVisibility() != GONE) {
				measureChild(child, widthMeasureSpec, heightMeasureSpec);
			}
		}

		maxWidth += getPaddingLeft() + getPaddingRight();
		maxHeight += getPaddingTop() + getPaddingBottom();

		Drawable drawable = getBackground();
		if (drawable != null) {
			maxHeight = Math.max(maxHeight, drawable.getMinimumHeight());
			maxWidth = Math.max(maxWidth, drawable.getMinimumWidth());
		}

		setMeasuredDimension(resolveSize(maxWidth, widthMeasureSpec),
				resolveSize(maxHeight, heightMeasureSpec));
	}

	private void drawPict(Canvas canvas, int x, int y, int w, int h, float sx,
			float sy) {
		canvas.save();
		canvas.translate(x, y);
		canvas.clipRect(0, 0, w, h);
		canvas.scale(0.5f, 0.5f);
		canvas.scale(sx, sy, w, h);
		canvas.drawPicture(mPicture);
		canvas.restore();
	}

	@Override
	protected void dispatchDraw(Canvas canvas) {
		super.dispatchDraw(mPicture.beginRecording(getWidth(), getHeight()));
		mPicture.endRecording();

		int x = getWidth() / 2;
		int y = getHeight() / 2;

		drawPict(canvas, 0, 0, x, y, 1, 1);
		drawPict(canvas, x, 0, x, y, -1, 1);
		drawPict(canvas, 0, y, x, y, 1, -1);
		drawPict(canvas, x, y, x, y, -1, -1);

	}

	@Override
	public ViewParent invalidateChildInParent(int[] location, Rect dirty) {
		location[0] = getLeft();
		location[1] = getTop();
		dirty.set(0, 0, getWidth(), getHeight());
		return getParent();
	}

	@Override
	protected void onLayout(boolean changed, int l, int t, int r, int b) {
		final int count = super.getChildCount();

		for (int i = 0; i < count; i++) {
			final View child = getChildAt(i);
			if (child.getVisibility() != GONE) {
				final int childLeft = getPaddingLeft();
				final int childTop = getPaddingTop();
				child.layout(childLeft, childTop,
						childLeft + child.getMeasuredWidth(),
						childTop + child.getMeasuredHeight());

			}
		}
	}
}

此软件可以不需要布局文件,布局全部采用代码生成,使用到了手机相应的传感器

注意,此指南针指针所指方向为正北,界面比较简单,没有做任何美化,有需要的可以查看附件
---------
指南针apk下载

指南针源码

转载于:https://my.oschina.net/chenzz/blog/119593

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Qt是一个跨平台的C++应用程序开发框架。Qt提供了许多UI控件来帮助我们构建应用程序。Qt指南针控件可以被用来实现一个指向某个方向的指南针。 在Qt中,我们可以使用QCompass类来读取设备的方向信息。我们可以把这个方向信息传递给指针控件的角度属性,使它指向正确的方向。指南针控件还可以使用图像来自定义指针的外观,使其更符合应用程序的主题。 为了下载这个控件,我们需要先安装Qt开发环境。然后,我们可以在Qt Creator中打开项目,点击Tool->Forms,直接在Designer中拖拽指南针控件到我们的应用程序窗口中。 如果我们想使用Qt指南针控件的高级功能,比如与传感器交互,我们需要使用Qt Mobility模块。这个模块包含了很多API来帮助我们方便地获取设备的方向和位置信息。 总之,Qt指南针控件是一个有用的UI控件,可以增强我们的应用程序的功能和用户体验。通过简单的设置,我们可以让指南针指向任何方向,并自定义它的外观,使其更符合我们的应用程序的需求。 ### 回答2: Qt 指南针控件是一款基于 Qt 库所开发的指南针控件,它能够在用户界面中方便地显示方向指示信息,有助于用户更好地了解当前朝向。下载 Qt 指南针控件主要可以通过以下步骤: 首先,打开 Qt 开发工具,选择 File 菜单下的 New File or Project 进入新建项目界面。在此界面中选择 Qt Widgets Application 作为项目类型,配置好项目的名称和路径等信息后,点击 Next。 接着,在项目配置界面中,勾选要使用的模块和库文件,确保 Qt 指南针控件能够被正常使用。在完成配置后,点击 Next 进入项目概览界面。 在项目概览界面中,确认项目设置无误,点击 Finish 按钮创建新项目。创建后,在项目工程目录中可以找到 Qt 指南针控件的源码文件和相关资源,包括头文件、源码文件和样式表等。 最后,将下载好的 Qt 指南针控件的文件复制到项目目录中,添加到项目中即可正常使用。可以参考 Qt 指南针控件的帮助文档和示例代码,了解更多的控件使用方法和注意事项。总的来说,Qt 指南针控件是一款非常实用的用户界面控件,它可以帮助用户更好地了解方向信息,提高用户体验,值得开发者们去尝试使用。 ### 回答3: Qt框架是一个基于C++编程语言的开发工具,可以帮助开发者快速构建跨平台应用程序。其中,Qt指南针控件是其自带的一种功能强大的界面控件,确保用户能够获取实时方向信息。 要下载Qt指南针控件,首先需要安装Qt框架。安装方法如下: 1. 登录Qt官网,进入下载页面 2. 根据所使用的操作系统选择合适版本,比如Windows、MacOS或Linux 3. 下载所需安装文件,一般包括Qt Creator和Qt库文件 4. 根据提示完成安装 在安装完成后,在Qt Creator中即可使用Qt指南针控件。具体使用方法如下: 1. 在Qt Creator中,新建一个Qt Widgets项目 2. 在项目界面中,选择“Design”模式,并选择“添加控件” 3. 在控件库中找到“指南针控件”(或者搜索“QwtCompass”) 4. 将控件拖放到窗口中 5. 可以通过属性编辑器,设置指针的颜色、指向方向等属性 除了通过Qt Creator使用Qt指南针控件,还可以通过安装Qt Qwt库来使用。这是一个基于Qt的轻量级图表和数据可视化工具,其中包括了Qt指南针控件。要使用Qt Qwt库,则需要执行以下步骤: 1. 打开Qt Creator,新建一个Qt Widgets项目 2. 从Qt Qwt官网下载对应版本的库文件 3. 将库文件解压缩,并将其复制到Qt项目的根目录中 4. 在.pro文件中添加如下代码: # Qwt INCLUDEPATH += $$PWD/qwt-6.1.5/include LIBS += -L$$PWD/qwt-6.1.5/lib -lqwt 5. 在Qt Creator中打开项目,添加以下头文件: #include <qwt_compass.h> #include <qwt_compass_rose.h> 通过以上步骤即可使用Qt指南针控件,实现方向指示功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值