最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

[源码]

IT圈 admin 42浏览 0评论

[源码]

为什么80%的码农都做不了架构师?>>>   

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

写成后的界面如下

package com.ntpass;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")@Overrideprotected 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);}@Overrideprotected void onResume() {super.onResume();mSensorManager.registerListener(mListener, mSensor,SensorManager.SENSOR_DELAY_GAME);}@Overrideprotected 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();}@Overrideprotected 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);}@Overrideprotected void onAttachedToWindow() {super.onAttachedToWindow();}@Overrideprotected void onDetachedFromWindow() {super.onDetachedFromWindow();}}
}

package com.ntpass;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;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);}@Overridepublic void setContentView(View view) {if (TEST_PICTURE) {ViewGroup vg = new PictureLayout(this);vg.addView(view);view = vg;}super.setContentView(view);}
}

package com.ntpass;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);}@Overridepublic void addView(View child) {if (getChildCount() > 1) {throw new IllegalStateException("PictureLayout can host only one direct child");}super.addView(child);}@Overridepublic void addView(View child, int index) {if (getChildCount() > 1) {throw new IllegalStateException("PictureLayout can host only one direct child");}super.addView(child, index);}@Overridepublic void addView(View child, LayoutParams params) {if (getChildCount() > 1) {throw new IllegalStateException("PictureLayout can host only one direct child");}super.addView(child, params);}@Overridepublic 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);}@Overrideprotected LayoutParams generateDefaultLayoutParams() {return new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT);}@Overrideprotected 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();}@Overrideprotected 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);}@Overridepublic ViewParent invalidateChildInParent(int[] location, Rect dirty) {location[0] = getLeft();location[1] = getTop();dirty.set(0, 0, getWidth(), getHeight());return getParent();}@Overrideprotected 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下载

指南针源码

转载于:

[源码]

为什么80%的码农都做不了架构师?>>>   

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

写成后的界面如下

package com.ntpass;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")@Overrideprotected 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);}@Overrideprotected void onResume() {super.onResume();mSensorManager.registerListener(mListener, mSensor,SensorManager.SENSOR_DELAY_GAME);}@Overrideprotected 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();}@Overrideprotected 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);}@Overrideprotected void onAttachedToWindow() {super.onAttachedToWindow();}@Overrideprotected void onDetachedFromWindow() {super.onDetachedFromWindow();}}
}

package com.ntpass;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;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);}@Overridepublic void setContentView(View view) {if (TEST_PICTURE) {ViewGroup vg = new PictureLayout(this);vg.addView(view);view = vg;}super.setContentView(view);}
}

package com.ntpass;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);}@Overridepublic void addView(View child) {if (getChildCount() > 1) {throw new IllegalStateException("PictureLayout can host only one direct child");}super.addView(child);}@Overridepublic void addView(View child, int index) {if (getChildCount() > 1) {throw new IllegalStateException("PictureLayout can host only one direct child");}super.addView(child, index);}@Overridepublic void addView(View child, LayoutParams params) {if (getChildCount() > 1) {throw new IllegalStateException("PictureLayout can host only one direct child");}super.addView(child, params);}@Overridepublic 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);}@Overrideprotected LayoutParams generateDefaultLayoutParams() {return new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT);}@Overrideprotected 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();}@Overrideprotected 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);}@Overridepublic ViewParent invalidateChildInParent(int[] location, Rect dirty) {location[0] = getLeft();location[1] = getTop();dirty.set(0, 0, getWidth(), getHeight());return getParent();}@Overrideprotected 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下载

指南针源码

转载于:

发布评论

评论列表 (0)

  1. 暂无评论