在一些比较文艺范的APP中我们常常见到背景图可以重力感应左右移动,看起来又文艺又好看,今天我们就来实现这个效果

首先在布局中放一个ImageView

<pre name="code" class="html"><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><ImageViewandroid:id="@+id/iv_bg"android:layout_width="wrap_content"android:layout_height="match_parent"android:scaleType="matrix" />
</LinearLayout>

然后,按照我写的上一篇博客,读取assets目录中的高清图片,并将其设置到ImageView上

     ivBg = (ImageView) findViewById(R.id.iv_bg);//导入assets文件夹中的文件并将其设置到背景图片控件上try {InputStream open = getResources().getAssets().open("school.jpg");Bitmap bitmap = BitmapFactory.decodeStream(open);ivBg.setImageBitmap(bitmap);} catch (IOException e) {e.printStackTrace();}

设置图片的缩放模式使其占据全屏

        //设置图片的缩放模式和显示位置并设置mMatrix = new Matrix();mMatrix.postScale(1.5f, 1.5f, 0.5f, 0.5f);mMatrix.postTranslate(-540, 0);ivBg.setImageMatrix(mMatrix);ivBg.invalidate();

初始化重力感应Sensor

        //获取系统传感器服务sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);//设置监听器监听加速度传感器(重力感应器)的状态,精度为普通(SENSOR_DELAY_NORMAL)sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);

传感器监听

/*** 传感器监听** @param event*/@Overridepublic void onSensorChanged(SensorEvent event) {//若传感器类型为加速度传感器(重力感应器)if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {//获取X坐标int x = (int) event.values[SensorManager.DATA_X];if (x == 0) orientation = RIGHT_1;//默认向左移动if (x < 2 && x > 0) orientation = RIGHT_1;if (x > 2) orientation = RIGHT_2;if (x < 0 && x > -2) orientation = LEFT_1;if (x < -2) orientation = LEFT_2;}}@Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) {}

自定义一个动画类

/*** 自定义动画*/public class MAnimation extends Animation {@Overrideprotected void applyTransformation(float interpolatedTime, Transformation t) {if (orientation == LEFT_1) {mMatrix.postTranslate(interpolatedTime * 2, 0);}if (orientation == RIGHT_1) {mMatrix.postTranslate(-interpolatedTime * 2, 0);}if (orientation == LEFT_2) {mMatrix.postTranslate(interpolatedTime * 5, 0);}if (orientation == RIGHT_2) {mMatrix.postTranslate(-interpolatedTime * 5, 0);}ivBg.setImageMatrix(mMatrix);ivBg.invalidate();}}

设置动画的各种属性

    /*** 设置动画属性* 将时间设置稍长以避免动画执行完成后重复执行的时候的停顿现象** @return*/private Animation getAnimation() {MAnimation animation = new MAnimation();animation.setDuration(600000);animation.setRepeatMode(Animation.REVERSE);animation.setRepeatCount(Animation.INFINITE);return animation;}

将动画设置给ImageView

        //为图片控件设置动画ivBg.startAnimation(getAnimation());

最后,如果只写到这的话,图片移动到边界的时候还会继续移动,所以我们必须进行边界判断

    /*** 获取左上坐标,用于边界条件的判断** @return*/private PointF getLeftPointF() {float[] values = new float[9];float[] rightValues = {1.5f, 0, -1080f, 0, 1.5f, -0.25f, 0, 0, 1.0f};float[] leftValues = {1.5f, 0, 0, 0, 1.5f, -0.25f, 0, 0, 1.0f};mMatrix.getValues(values);//若超出边界,为其设置自定义的位置if (values[2] < -1080) {mMatrix.setValues(rightValues);}if (values[2] > 0) {mMatrix.setValues(leftValues);}float leftX = values[2];float leftY = values[5];return new PointF(leftX, leftY);}

当然,我这个代码还是很幼稚的,适配性也很差很差,但是确实可以实现想要的效果,而且貌似也没有BUG....反正能用!

以下是完整代码

package androidstudio.myapplication;import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.animation.Animation;
import android.view.animation.Transformation;
import android.widget.ImageView;import java.io.IOException;
import java.io.InputStream;public class MainActivity extends AppCompatActivity implements SensorEventListener {private ImageView ivBg;private Matrix mMatrix;private SensorManager sensorManager;//以速度1向左移动private static final int LEFT_1 = 1;//以速度2向左移动private static final int LEFT_2 = 2;//以速度1向右移动private static final int RIGHT_1 = 3;//以速度2向右移动private static final int RIGHT_2 = 4;private int orientation;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ivBg = (ImageView) findViewById(R.id.iv_bg);//导入assets文件夹中的文件并将其设置到背景图片控件上try {InputStream open = getResources().getAssets().open("school.jpg");Bitmap bitmap = BitmapFactory.decodeStream(open);ivBg.setImageBitmap(bitmap);} catch (IOException e) {e.printStackTrace();}//设置图片的缩放模式和显示位置并设置mMatrix = new Matrix();mMatrix.postScale(1.5f, 1.5f, 0.5f, 0.5f);mMatrix.postTranslate(-540, 0);ivBg.setImageMatrix(mMatrix);ivBg.invalidate();//为图片控件设置动画ivBg.startAnimation(getAnimation());//获取系统传感器服务sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);//设置监听器监听加速度传感器(重力感应器)的状态,精度为普通(SENSOR_DELAY_NORMAL)sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);}/*** 设置动画属性* 将时间设置稍长以避免动画执行完成后重复执行的时候的停顿现象** @return*/private Animation getAnimation() {MAnimation animation = new MAnimation();animation.setDuration(600000);animation.setRepeatMode(Animation.REVERSE);animation.setRepeatCount(Animation.INFINITE);return animation;}/*** 自定义动画*/public class MAnimation extends Animation {@Overrideprotected void applyTransformation(float interpolatedTime, Transformation t) {//运行方法,获取左上点的坐标,用于设置边界getLeftPointF();if (orientation == LEFT_1) {mMatrix.postTranslate(interpolatedTime * 2, 0);}if (orientation == RIGHT_1) {mMatrix.postTranslate(-interpolatedTime * 2, 0);}if (orientation == LEFT_2) {mMatrix.postTranslate(interpolatedTime * 5, 0);}if (orientation == RIGHT_2) {mMatrix.postTranslate(-interpolatedTime * 5, 0);}ivBg.setImageMatrix(mMatrix);ivBg.invalidate();}}/*** 传感器监听** @param event*/@Overridepublic void onSensorChanged(SensorEvent event) {//若传感器类型为加速度传感器(重力感应器)if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {//获取X坐标int x = (int) event.values[SensorManager.DATA_X];if (x == 0) orientation = RIGHT_1;//默认向左移动if (x < 2 && x > 0) orientation = RIGHT_1;if (x > 2) orientation = RIGHT_2;if (x < 0 && x > -2) orientation = LEFT_1;if (x < -2) orientation = LEFT_2;}}@Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) {}/*** 获取左上坐标,用于边界条件的判断** @return*/private PointF getLeftPointF() {float[] values = new float[9];float[] rightValues = {1.5f, 0, -1080f, 0, 1.5f, -0.25f, 0, 0, 1.0f};float[] leftValues = {1.5f, 0, 0, 0, 1.5f, -0.25f, 0, 0, 1.0f};mMatrix.getValues(values);//若超出边界,为其设置自定义的位置if (values[2] < -1080) {mMatrix.setValues(rightValues);}if (values[2] > 0) {mMatrix.setValues(leftValues);}float leftX = values[2];float leftY = values[5];return new PointF(leftX, leftY);}
}

简单方法实现重力感应背景图(GravityImageView)相关推荐

  1. img撑满全屏的方法(img非背景图)

    我有一个模板,想按常规做一个div里面放置一个img图片,并且让图片铺满容器,自适应容器大小.HTML结构代码如下(在这个盒模型上,我已经放置了一些不重要的样式). <div style=&qu ...

  2. 简述改变计算机桌面背景的方法,win7开关机背景图怎么更换_win7电脑换开关机壁纸图片的方法...

    最近有朋友问小编win7开关机背景图怎么更换的问题,对于这个问题,相信很多朋友都不是太清楚,有时我们会觉得电脑默认的开关机壁纸不好看,那么我们应该如何更换win7开关机背景图呢?别着急,今天小编就针对 ...

  3. 原创:新手快速熟悉IDEA快捷键方法:快捷键修改+背景图设置

    对于一个Coder来说,开发工具就是吃饭的家伙 我晚上花了两个小时来完善一下开发工具IDEA,让自己打起来舒服一点点 很多设置CSDN都有,而且非常详细,这里就不重复造轮子了. 本文主要是提供一个给新 ...

  4. Kinect for windows的重力感应和角度马达

    上图是Kinect的重力感应方向图,Kinect右边为X正方向,最大值为1,反方向为-1,Kinect下方为Y正方向,最大值为1,反方向为-1,Kinect后面为Z正方向,最大值为1,反方向为-1. ...

  5. html根据PC手机设置不同背景图,Html-根据不同的分辨率设置不同的背景图片

    @media only screen and (min-width: 1024px)     //当分辨率width >= 1024px 时使用1.jpg作为背景图片 { .bg{ backgr ...

  6. python窗体加背景图_第二十三篇 -- 为窗体添加背景图片和图标以及设置窗体透明度...

    效果图: play.py #!/usr/bin/env python#_*_ coding: UTF-8 _*_ """========================= ...

  7. Html/Javascript game animated background 游戏动态背景图:卷轴效果(附代码)

    游戏的背景图如果是动态的, 效果会好很多, 最简单的做法是让背景图有一种卷轴效果,即看起来背景图一直是从上往下,或者从右往左移动.以前用python 做过,这里把python 写为Javascript ...

  8. SVG 背景图生成器:Heazy

    Heazy,一款在线的SVG 背景图生成器,能够让你的网站背景.设计文稿.PPT.海报背景等等生成酷炫的SVG背景图,使用的时候,根据提供的预设SVG背景图模版进行手动参数调整或者随机推荐,即可创作出 ...

  9. 微信小程序中这么简单的设置页面背景图及字体颜色的方法,你还不会?

    在微信小程序中,我们不免的要设置背景图片和字体颜色. 那怎么样才能做到简单的设置背景图片和字体颜色呢? 话不多说,直接开讲 首先先说怎么设置页面背景图片: 这是博主准备的照片. 下面是在wxml中的代 ...

最新文章

  1. 改变uTools的插件安装/数据目录
  2. python whl 包制作
  3. mysql的复制订阅_如何删除发布与复制订阅数据库 'distribuion' 的方法
  4. JAVA Web学习篇--Servlet
  5. “Python编程及大数据应用”课程教师(厦门)寒假研修班
  6. Ubuntu 16.04的k8s安装配置
  7. 我所认识的EXT2(二)
  8. Linux缺少rz和sz命令
  9. BurpSuite+Proxifer 抓取PC客户端HTTP数据包
  10. 计算机木材染色 配色技术的应用技术,计算机配色技术在木材连缸染色中的应用研究.pdf...
  11. 希捷硬盘查询保修期限的网址
  12. 嵌入式开发——用memtester软件进行内存压力测试
  13. UCloud成首个通过乌云认证的云计算平台
  14. 学java的就业方向_学Java以后的就业方向
  15. 8个良心的国产小众软件,知乎10w人精选!
  16. 字符串中Emoji表情处理
  17. 计算机中怎么改邮箱地址,谁可以讲讲如何设置电脑邮箱
  18. python--真气网监测站点数据的抓取
  19. 基于DeepFace模型设计的人脸识别软件
  20. 小米手机6X简单刷成开发版启用Root权限的流程

热门文章

  1. 实例:利用友盟崩溃统计+mapping.txt文件定位项目的错误
  2. 老男孩学python多少钱_老男孩学Python编程后薪资待遇高吗?
  3. 光纤和光缆有什么区别?
  4. **kwargs python_python中**kwargs怎么用?
  5. 老公是用来欺负,老婆是用来疼的!(猪公与小猪妹修改篇)
  6. 3月24日服务器维护公告,阴阳师3月24日维护更新 重要更新内容公告
  7. js字符串拼接效率问题
  8. STM32输出 PWM频率 占空比 连续可调~~
  9. 技术和学历哪个更重要,用人单位更看重什么?
  10. 消息队列的五个使用场景