我是个自学安卓开发的菜鸟,糊里糊涂地参加了一个安卓应用开发的项目。项目中有这样的需求:
一张很大的背景图,用户通过拖动来查看背景图的不同区域;背景图上还有小图片,也需要在背景图滑动的同时跟着一起动。
我一开始想,这还不好做嘛,直接把用ImageView控件显示图片,加一个触摸监听事件,根据触摸距离调整控件位置不就得了?然而第一个问题出现了:无法按照原大小显示图片。
↑我期望的效果
↑实际的效果
按照网上的说法,想要以原大小显示图片,只要在该ImageView控件里加这么一行:android:scaleType="matrix"
我加上之后,的确能够按照原大小显示图片了,然而我为ImageView添加了OnTouchListener之后,改变ImageView控件的位置,发现一开始未显示的图片,在滑动时也不能显示。
↑左图为未拖动的显示,右图为拖动之后的显示,可以看出,超出屏幕的图片在拖动控件之后并没有如期出现
当时我还百思不得其解,回想起来,这其实是因为ImageView是屏幕内的控件,即使把它设为
android:layout_width="wrap_content"
android:layout_height="wrap_content"
ImageView的大小也不会超出屏幕的。所以在其内容超出屏幕大小时,ImageView的大小也依然是屏幕大小,滑动时是把ImageView移来移去,自然也不能指望着ImageView控件范围之外呈现出ImageView的内容。
那么解决方法也就出来了:
我不该移动ImageView的位置,而是应考虑滑动时需要把图片的哪一部分显示在ImageView中
↑蓝框表示ImageView控件,右边为我想显示的大图,被填充的区域为大图需要显示在ImageView中的部分
但是默认的ImageView似乎并没有这个功能,所以我决定试着写一个能实现上述功能的自定义View控件类。
这个控件的功能呢,就是被拖动时,计算在原图中需要截取的图片的起始位置。
你问我为什么不需要知道宽和高?因为宽和高就是获取到的设备屏幕的宽和高呀。
你问我怎么获取设备的宽和高?其实很简单,我也是从网上查的,贴在这好啦:
DisplayMetrics dm=new DisplayMetrics(); super.getWindowManager().getDefa