安卓编程罗盘时钟代码是什么
-
安卓编程中实现罗盘时钟的代码如下:
import android.app.Activity; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.RectF; 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 CompassClockActivity extends Activity implements SensorEventListener { private SensorManager sensorManager; private Sensor accelerometer; private Sensor magnetometer; private float[] gravityValues = new float[3]; private float[] magneticValues = new float[3]; private float azimuth = 0; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(new CompassView(this)); sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); magnetometer = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); } @Override protected void onResume() { super.onResume(); sensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_GAME); sensorManager.registerListener(this, magnetometer, SensorManager.SENSOR_DELAY_GAME); } @Override protected void onPause() { super.onPause(); sensorManager.unregisterListener(this); } @Override public void onSensorChanged(SensorEvent event) { if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { gravityValues = event.values; } if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) { magneticValues = event.values; } float[] rotationMatrix = new float[9]; boolean success = SensorManager.getRotationMatrix(rotationMatrix, null, gravityValues, magneticValues); if (success) { float[] orientationValues = new float[3]; SensorManager.getOrientation(rotationMatrix, orientationValues); azimuth = (float) Math.toDegrees(orientationValues[0]); } } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) {} private class CompassView extends View { private Paint paint; public CompassView(Context context) { super(context); paint = new Paint(); paint.setAntiAlias(true); paint.setTextSize(40); paint.setStrokeWidth(3); } @Override protected void onDraw(Canvas canvas) { int width = getWidth(); int height = getHeight(); int radius = Math.min(width, height) / 2; int cx = width / 2; int cy = height / 2; // 绘制背景 paint.setColor(Color.WHITE); canvas.drawPaint(paint); // 绘制圆盘 paint.setColor(Color.BLACK); paint.setStyle(Paint.Style.STROKE); canvas.drawCircle(cx, cy, radius, paint); // 绘制指针 paint.setColor(Color.RED); paint.setStyle(Paint.Style.FILL); canvas.save(); canvas.rotate(-azimuth, cx, cy); canvas.drawRect(new RectF(cx - 5, cy - radius, cx + 5, cy), paint); canvas.restore(); // 绘制文字 paint.setColor(Color.BLACK); paint.setStyle(Paint.Style.FILL); canvas.drawText("N", cx - paint.measureText("N") / 2, cy - radius + 40, paint); canvas.drawText("S", cx - paint.measureText("S") / 2, cy + radius - 10, paint); canvas.drawText("W", cx - radius + 10, cy + paint.getTextSize() / 2, paint); canvas.drawText("E", cx + radius - paint.measureText("E") - 10, cy + paint.getTextSize() / 2, paint); invalidate(); } } }这段代码实现了一个简单的安卓罗盘时钟。首先,在
onCreate方法中初始化了传感器,并在onResume和onPause方法中注册和取消注册传感器监听器。然后,在onSensorChanged方法中获取手机的加速度和磁场传感器数值,并根据这些数值计算出手机的方位角。最后,在onDraw方法中绘制罗盘的背景、圆盘、指针和文字。需要注意的是,为了使罗盘指针能够根据手机方位角的变化而旋转,我们使用了
canvas.save()和canvas.restore()方法来保存和恢复画布状态。1年前 -
安卓编程中,实现罗盘时钟的代码可以如下所示:
- 首先,在XML布局文件中定义一个TextView来显示当前时间和方向信息:
<TextView android:id="@+id/clockTextView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="24sp" android:gravity="center" android:layout_centerInParent="true"/>- 在Java代码中,首先获取到TextView的引用,并创建一个SensorManager对象来获取方向信息:
public class MainActivity extends AppCompatActivity implements SensorEventListener { private TextView clockTextView; private SensorManager sensorManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); clockTextView = findViewById(R.id.clockTextView); sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); } }- 在onResume()方法中注册方向传感器监听器,并在onPause()方法中注销监听器:
@Override protected void onResume() { super.onResume(); sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION), SensorManager.SENSOR_DELAY_NORMAL); } @Override protected void onPause() { super.onPause(); sensorManager.unregisterListener(this); }- 实现SensorEventListener接口的onSensorChanged()方法,在该方法中更新TextView的内容:
@Override public void onSensorChanged(SensorEvent event) { float azimuth = event.values[0]; String direction = ""; if (azimuth >= 0 && azimuth < 22.5) { direction = "北"; } else if (azimuth >= 22.5 && azimuth < 67.5) { direction = "东北"; } else if (azimuth >= 67.5 && azimuth < 112.5) { direction = "东"; } else if (azimuth >= 112.5 && azimuth < 157.5) { direction = "东南"; } else if (azimuth >= 157.5 && azimuth < 202.5) { direction = "南"; } else if (azimuth >= 202.5 && azimuth < 247.5) { direction = "西南"; } else if (azimuth >= 247.5 && azimuth < 292.5) { direction = "西"; } else if (azimuth >= 292.5 && azimuth < 337.5) { direction = "西北"; } else if (azimuth >= 337.5 && azimuth < 360) { direction = "北"; } SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss", Locale.getDefault()); String currentTime = sdf.format(new Date()); clockTextView.setText(currentTime + " " + direction); }- 最后,在AndroidManifest.xml文件中添加以下权限:
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>这样就实现了一个简单的罗盘时钟。当手机方向改变时,会实时更新显示当前时间和方向的TextView的内容。
1年前 -
安卓编程中实现罗盘时钟功能的代码可以分为以下几个步骤:
-
创建一个新的Android项目,并在布局文件中添加一个TextView来显示时间。
-
在MainActivity类中,获取TextView的实例,并创建一个Handler对象用于更新UI。
-
在onCreate()方法中,注册传感器监听器,并在onResume()和onPause()方法中分别启用和禁用传感器。
-
在onSensorChanged()方法中,通过SensorEvent获取罗盘传感器的方向,并将其转换为角度。
-
在run()方法中,使用SimpleDateFormat类格式化当前时间,并通过Handler.post()方法将时间更新到UI线程的TextView上。
下面是一个具体的代码示例:
- 在布局文件(activity_main.xml)中添加一个TextView:
<TextView android:id="@+id/clockTextView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="24sp" android:textStyle="bold" android:layout_gravity="center_horizontal"/>- 在MainActivity类中添加以下代码:
import android.app.Activity; import android.content.Context; 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.view.WindowManager; import android.widget.TextView; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; public class MainActivity extends Activity implements SensorEventListener { private TextView clockTextView; private SensorManager sensorManager; private Sensor compassSensor; private float currentDegree = 0f; private Handler handler = new Handler(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); clockTextView = findViewById(R.id.clockTextView); sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); compassSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); } @Override protected void onResume() { super.onResume(); sensorManager.registerListener(this, compassSensor, SensorManager.SENSOR_DELAY_NORMAL); } @Override protected void onPause() { super.onPause(); sensorManager.unregisterListener(this); } @Override public void onSensorChanged(SensorEvent event) { float degree = Math.round(event.values[0]); currentDegree = -degree; } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } private Runnable run = new Runnable() { @Override public void run() { SimpleDateFormat sdf = new SimpleDateFormat("hh:mm:ss", Locale.getDefault()); String currentTime = sdf.format(new Date()); clockTextView.setText(currentTime); clockTextView.setRotation(currentDegree); handler.postDelayed(this, 1000); } }; @Override protected void onStart() { super.onStart(); handler.post(run); } @Override protected void onStop() { super.onStop(); handler.removeCallbacks(run); } }上述代码中,我们首先通过findViewById()方法获取了布局文件中的TextView实例,并创建了一个SensorManager对象来管理传感器。然后,在onCreate()方法中注册了罗盘传感器的监听器,并在onResume()和onPause()方法中分别启用和禁用了传感器。接下来,在onSensorChanged()方法中获取了罗盘传感器的方向,并将其转换为角度。最后,在run()方法中使用SimpleDateFormat类格式化当前时间,并通过Handler.post()方法将时间更新到UI线程的TextView上,并使用setRotation()方法将TextView旋转到与罗盘传感器方向一致的角度。
这样,当应用程序启动时,TextView将显示当前时间,并随着罗盘传感器的方向进行旋转。
1年前 -