通过左右滑动缩放图片
2015-12-06 17:03
323 查看
需要用到手势监听器 GestureDetector 的实例。GestureDetector在前面的内容中介绍过(/article/10639729.html)
从左往右放大图片,从右往左缩小图片,效果如下 (AndroidStudio 1.5):
![](http://img.blog.csdn.net/20151206172251522?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
content_main.xml :
MainActivity.java :
从左往右放大图片,从右往左缩小图片,效果如下 (AndroidStudio 1.5):
content_main.xml :
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" app:layout_behavior="@string/appbar_scrolling_view_behavior" tools:context="com.crazy.gesturedetector.MainActivity" tools:showIn="@layout/activity_main"> <ImageView android:id="@+id/show" android:layout_width="match_parent" android:layout_height="match_parent" android:scaleType="center" /> </LinearLayout>
MainActivity.java :
package com.crazy.gesturedetector; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Matrix; import android.graphics.drawable.BitmapDrawable; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.GestureDetector; import android.view.MotionEvent; import android.widget.ImageView; public class MainActivity extends AppCompatActivity implements GestureDetector.OnGestureListener { GestureDetector detector; ImageView imageView; Bitmap bitmap; int width, height; // 缩放比(当前状态) float currentScale = 1; // 控制图片缩放的 matrix Matrix matrix; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); detector = new GestureDetector(this, this); imageView = (ImageView)findViewById(R.id.show); matrix = new Matrix(); // 获取被缩放的源图片 bitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.x01); // 获取位图宽 width = bitmap.getWidth(); // 获取位图高 height = bitmap.getHeight(); // 设置 ImageView 初始化时显示的图片(最好不要设置缩放模式,感觉不好看) imageView.setImageBitmap((BitmapFactory.decodeResource( this.getResources(), R.drawable.x01))); } /** * 将该 Activity 上触碰事件交给 GestureDetector 处理 */ @Override public boolean onTouchEvent(MotionEvent event) { return detector.onTouchEvent(event); } @Override public boolean onDown(MotionEvent e) { return false; } @Override public void onShowPress(MotionEvent e) { } @Override public boolean onSingleTapUp(MotionEvent e) { return false; } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { return false; } @Override public void onLongPress(MotionEvent e) { } /** * * @param e1 * @param e2 * @param velocityX “拖动”动作在横向上的速度 * @param velocityY “拖动”动作在纵向上的速度 * @return */ @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { // 取得最大速度 velocityX = velocityX > 3000 ? 3000 : velocityX; velocityX = velocityX < -3000 ? -3000 : velocityX; currentScale += currentScale * velocityX / 3000.0f; // 让缩放比不等于 0 currentScale = currentScale > 0.01 ? currentScale: 0.01f; // 重置 matrix (如果不重置,且手通过屏幕缩放的次数过多,可能会导致内存溢出 OutOfMemoryError) matrix.reset(); // 缩放 matrix.setScale(currentScale, currentScale, 150, 200); BitmapDrawable bitmapDrawable = (BitmapDrawable)imageView.getDrawable(); // 强制回收没有回收的图片 if (!bitmapDrawable.getBitmap().isRecycled()) bitmapDrawable.getBitmap().recycle(); // 回收后,根据原始图和 matrix 创建新的图片 Bitmap bitmap2 = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true); // 显示新的图片 imageView.setImageBitmap(bitmap2); return true; } }
相关文章推荐
- 黑苹果安装傻瓜教程
- Gradle多渠道打包 (1)
- Windows下LM-Hash与NTLM-Hash生成原理
- LIGHTOJ-1148 - Mad Counting(规律)
- zzuli OJ 1124: 两个有序数组合并
- emacs 安装及配置
- vuejs学习资料
- C-049.宏定义#define
- 【JavaScript】(5)——JavaScript与cookie、XML交互
- C 标准库 strcspn 函数的实现
- 64位windows系统下安装Memcache缓存
- Arduino 平台与C语言程序设计-week1-Arduino Environment-Lesson2
- 文章标题
- 图论入门(2):Dijkstra算法(POJ 2387)
- Java 学习笔记(一)
- 判断是不是Android 5.0 Lollipop
- CCF201412-4 最佳灌溉(最小代价生成树)
- 第九周 【项目4.2 -广义表的原子统计】
- 欢迎使用CSDN-markdown编辑器
- 最高人民法院关于适用《中华人民共和国婚姻法》若干问题的解释