转载请注明出处: http://blog.csdn.net/iwanghang/article/details/53418690

我正在参加CSDN 2016博客之星评选,希望得到您的宝贵一票~
http://blog.csdn.net/vote/candidate.html?username=iwanghang
请为我投票,谢谢 ~~
如果没有CSDN账号 直接使用微信/QQ/微博登陆 就能投票了~~

用传感器做一个小方块自由移动,以屏幕为边界~

既然是以屏幕为边界,那么左上角肯定是坐标0,0,右下角如何获取呢
就要用到Displaymetrics 取得手机屏幕大小的关键类,

我用一段代码我具体表示一下如何获取屏幕大小,请看:

public static String getDisplayMetrics(Context cx) { String str = ""; DisplayMetrics dm = new DisplayMetrics(); //取得DisplayMetrics对象方法一//dm = cx.getApplicationContext().getResources().getDisplayMetrics(); //取得DisplayMetrics对象方法二((Activity)cx).getWindowManager().getDefaultDisplay().getMetrics(dm);int screenWidth = dm.widthPixels; int screenHeight = dm.heightPixels; float density = dm.density; float xdpi = dm.xdpi; float ydpi = dm.ydpi; str += "The absolute width:" + String.valueOf(screenWidth) + "pixels\n"; str += "The absolute heightin:" + String.valueOf(screenHeight) + "pixels\n"; str += "The logical density of the display.:" + String.valueOf(density) + "\n"; str += "X dimension :" + String.valueOf(xdpi) + "pixels per inch\n"; str += "Y dimension :" + String.valueOf(ydpi) + "pixels per inch\n"; return str; } 

其实,很多时候,我们做屏幕适配的时候,获取屏幕大小会比较有用~
之前打算写一篇屏幕适配的博文,但是想了想,可以说的内容太少了~
做为一个Android的新手,屏幕适配会用,但是实际上经手过的需要屏幕适配的项目还没有
所以迟迟没写,等有了相关经验一定写一下屏幕适配~

注意这个Demo没有计算状态栏和标题栏的高度,所以要去掉/隐藏状态栏和标题栏
我这边用真机测试,所以用别人手机拍了一个MP4,又用GifCam抓取变成GIF,但是大小为8M上传不了
我的同事用PS,帮我转换了一下颜色深度和大小,才勉强变成2M以内,我同事的博客 http://blog.csdn.net/sundayaaron

项目源码下载(免积分): http://download.csdn.net/detail/iwanghang/9698771

我们看一下动态GIF图和代码

MainActivity.java:

package com.iwanghang.sensordemo2;import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.WindowManager;public class MainActivity extends AppCompatActivity {private RectView rv;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//隐藏标题栏getSupportActionBar().hide();//取消状态栏getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);// 获取屏幕宽高DisplayMetrics dm = new DisplayMetrics();getWindowManager().getDefaultDisplay().getMetrics(dm);rv = new RectView(this,dm.widthPixels,dm.heightPixels);setContentView(rv);SensorManager sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);Sensor type_gravity = sm.getDefaultSensor(Sensor.TYPE_GRAVITY);// 重力传感器sm.registerListener(new SensorEventListener() {@Overridepublic void onSensorChanged(SensorEvent sensorEvent) {float x = sensorEvent.values[0];float y = sensorEvent.values[1];System.out.println("x = " + x + " + " + y);rv.rect.setLeft(Math.round(x)*10);rv.rect.setTop(Math.round(y)*10);rv.invalidate(); // 重绘}@Overridepublic void onAccuracyChanged(Sensor sensor, int i) {}},type_gravity,SensorManager.SENSOR_DELAY_NORMAL);}
}

Rect.java:

package com.iwanghang.sensordemo2;/*** 小方块 对象*/
public class Rect {float left = 100, top = 100, right = 100, bottom = 100;private int width,height;public Rect(int width, int height) {this.width = width;this.height = height;left = width/2-right/2;top = height/2-bottom/2;}public float getLeft() {return left;}public void setLeft(float left) {this.left -= left;if (this.left<=0){this.left = 0;}else if(this.left>=width-this.right){this.left = width-this.right;}}public float getTop() {return top;}public void setTop(float top) {this.top += top;if (this.top<=0){this.top = 0;}else if(this.top>=height-this.bottom){this.top = height-this.bottom;}}public float getRight() {return right;}public void setRight(float right) {this.right = right;}public float getBottom() {return bottom;}public void setBottom(float bottom) {this.bottom = bottom;}
}

RectView.java:

package com.iwanghang.sensordemo2;import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.View;/*** 小方块 视图*/
public class RectView extends View{Rect rect;private int widh,height;Paint paint;public RectView(Context context, int width, int height) {super(context);this.widh = width;this.height = height;paint = new Paint(); // 实例化画笔paint.setColor(Color.GREEN);rect = new Rect(width,height);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);canvas.drawRect(rect.getLeft(),rect.getTop(),rect.getLeft()+rect.getRight(),rect.getTop()+rect.getBottom(),paint);}
}

avtivity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context="com.iwanghang.sensordemo2.MainActivity"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Hello World!" />
</RelativeLayout>

转载请注明出处: http://blog.csdn.net/iwanghang/article/details/53418690

欢迎移动开发爱好者交流
沈阳或周边城市公司有意开发Android,请与我联系
联系方式

微信:iwanghang
QQ:413711276
邮箱:iwanghang@qq.com

Android开发-Sensor传感器-AndroidStudio(二)小方相关推荐

  1. 我的Android进阶之旅------Android利用Sensor(传感器)实现水平仪功能的小例

    这里介绍的水平仪,指的是比较传统的气泡水平仪,在一个透明圆盘内充满液体,液体中留有一个气泡,当一端翘起时,该气泡就会浮向翘起的一端.    利用方向传感器返回的第一个参数,实现了一个指南针小应用.   ...

  2. Android开发笔记(一百二十六)自定义音乐播放器

    MediaRecorder/MediaPlayer 在Android手机上面,音频的处理比视频还要复杂,这真是出人意料.在前面的博文< Android开发笔记(五十七)录像录音与播放>中, ...

  3. android 获取加速度传感器值,Android开发获取传感器数据的方法示例【加速度传感器,磁场传感器,光线传感器,方向传感器】...

    本文实例讲述了Android开发获取传感器数据的方法.分享给大家供大家参考,具体如下: package mobile.android.sensor; import java.util.List; im ...

  4. Android开发笔记(一百二十二)循环器视图RecyclerView

    RecyclerView RecyclerView是Android在support-v7库中新推出控件,中文别名为循环器视图,它的功能非常强大,可分别实现ListView.GridView,以及瀑布流 ...

  5. android开发中磁场传感器,Android开发获取传感器数据的方法示例【加速度传感器,磁场传感器,光线传感器,方向传感器】...

    本文实例讲述了Android开发获取传感器数据的方法.分享给大家供大家参考,具体如下: package mobile.android.sensor; import java.util.List; im ...

  6. Android开发笔记(一百二十三)下拉刷新布局SwipeRefreshLayout

    SwipeRefreshLayout 下拉刷新布局SwipeRefreshLayout是Android又一与时俱进的控件,顾名思义它随着用户手势向下滑动就会触发刷新操作.从实际的下拉效果来看,Swip ...

  7. 【Android开发VR实战】二.播放360°全景视频

    转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/53924006 本文出自[DylanAndroid的博客] [Android开发 ...

  8. android开发笔记汇总(二)

    有一段时间没有写博客了.一直想写,但是都被自己打败了,这里分享下这段时间遇到的bug之类的东西. adapter中的sort方法... 会自动生成两个基本对象,前面的是后一个对象,后面的是前一个对象, ...

  9. Android开发笔记(一百二十五)自定义视频播放器

    视频播放方式 在Android中播放视频的方式有两种: 1.使用MediaPlayer结合SurfaceView进行播放.其中通过SurfaceView显示视频的画面,通过MediaPlayer来设置 ...

最新文章

  1. 线性表的存储结构总结
  2. (MYSQL学习笔记4)事务的开启、提交、回滚
  3. 使用运行时动态创建属性
  4. Docker+Selenium Grid+Python搭建分布式测试环境
  5. Linux服务器的最大内存和CPU数
  6. word rectangle
  7. 腾讯云Service Mesh生产实践及架构演进
  8. Linux网络模块全局变量,()不是Linux系统的特色.
  9. 让TortoiseGit记住帐号密码方法
  10. Django终端运行报错:ImportError: DLL load failed while importing _sqlite3: 找不到指定的模块。
  11. 用T-SQL修改数据库的恢复模型
  12. linux mysql修改数据表结构语法
  13. HTTP-Runoob:教程
  14. UBUNTU18禁用锁屏功能
  15. 大一python简答题_大学moocPython编程基础答案大全
  16. C++ 对象的内存布局【转】
  17. java resin_resin启动问题
  18. Attach Debugger
  19. 【整理】CRISPR-Cas9用于病毒性传染病防控的最新进展
  20. c语言gets,getc,区分C语言中fgetc、getc、getchar、fgets、gets

热门文章

  1. Meetup | “数据调度+分析引擎”解锁企业数字化转型之路
  2. 基于java的语义分割,NeruIPS2019 | 深圳大学提出点云语义分割框架ELGS,效果拔群(代码已开源)...
  3. Your branch and 'origin/master' have diverged, and have # and # different commits each, respectively
  4. 一、iOS逆向:iOS手机越狱
  5. 新手小白学JAVA 面向对象之多态
  6. 尚硅谷Spring注解开发学习笔记
  7. FOXmail客户端配置
  8. linux下 df和du用法,Linux df 与du用法
  9. 程序员面试金典(第 6 版)(简单篇)
  10. vim配置全攻略(2)——vim的简单配置