概述
这是一个可以设置成圆角或者圆角矩形的ImageView,并且可以设置是否支持多点触控放大,缩小,旋转图片,双击放大缩小的自定义的控件。还有一个仿刮刮卡效果的自定义View。
效果展示
效果展示
录制的视频5.4M,可能打不开得下下来看。
相关知识点
- android matrix 最全方法详解与进阶(完整篇)
这里用于图形变换如:放大缩小,平移,旋转 - Android的事件分发机制
这里用于解决ImageView与ViewPager嵌套时的事件冲突 - xFermode的原理及使用
这里用于设置ImageView内图片的形状:圆形和圆角矩形
还有自定义View的刮刮卡效果 - GestureDetector与ScaleGestureDetector入门
Google的扩展的手势监听api - 其他(来不及了,要开车了!默认你懂了)
关键代码和注意事项
初始化
因为我们是使用matirx来做图形的变化,所以要设置 setScaleType(ScaleType.MATRIX);图形变换的方法setImageMatrix(Matrix matrix);才会生效。
接着我们在xml中配置ImageView
<com.example.administrator.imagetest.MyImageView
android:id="@+id/iv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@mipmap/test" />
问题来了,图片太大显示不全,而且位于控件的左上角。我想让他像微信一样,自动调整到控件中心点,并且等比例缩放到一个屏幕放的下。这时我们就要在控件图像被绘制出来的时候,调整图片大小和位置
实现implements ScaleGestureDetector.OnScaleGestureListener接口
/**
* 控件被加载到窗口时,监听View变化
*/
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
getViewTreeObserver().addOnGlobalLayoutListener(this);
}
}
/**
* 控件被销毁时,关闭监听
*/
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
}
初始化图片大小和位置:
/**
* 当View发生改变的时候,会调用这个监听,可能多次调用,所以要加判断
*/
@Override
public void onGlo