package aiyuan1996.cn.firerunning.Utils;
import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.widget.ImageView;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
/**
* 手势图片控件
*
* @author clifford
*/
public class PinchImageView extends ImageView {
////////////////////////////////配置参数////////////////////////////////
/**
* 图片缩放动画时间
*/
public static final int SCALE_ANIMATOR_DURATION = 200;
/**
* 惯性动画衰减参数
*/
public static final float FLING_DAMPING_FACTOR = 0.9f;
/**
* 图片最大放大比例
*/
private static final float MAX_SCALE = 4f;
////////////////////////////////监听器////////////////////////////////
/**
* 外界点击事件
*
* @see #setOnClickListener(OnClickListener)
*/
private OnClickListener mOnClickListener;
/**
* 外界长按事件
*
* @see #setOnLongClickListener(OnLongClickListener)
*/
private OnLongClickListener mOnLongClickListener;
@Override
public void setOnClickListener(OnClickListener l) {
//默认的click会在任何点击情况下都会触发,所以搞成自己的
mOnClickListener = l;
}
@Override
public void setOnLongClickListener(OnLongClickListener l) {
//默认的long click会在任何长按情况下都会触发,所以搞成自己的
mOnLongClickListener = l;
}
////////////////////////////////公共状态获取////////////////////////////////
/**
* 手势状态:自由状态
*
* @see #getPinchMode()
*/
public static final int PINCH_MODE_FREE = 0;
/**
* 手势状态:单指滚动状态
*
* @see #getPinchMode()
*/
public static final int PINCH_MODE_SCROLL = 1;
/**
* 手势状态:双指缩放状态
*
* @see #getPinchMode()
*/
public static final int PINCH_MODE_SCALE = 2;
/**
* 外层变换矩阵,如果是单位矩阵,那么图片是fit center状态
*
* @see #getOuterMatrix(Matrix)
* @see #outerMatrixTo(Matrix, long)
*/
private Matrix mOuterMatrix = new Matrix();
/**
* 矩形遮罩
*
* @see #getMask()
* @see #zoomMaskTo(RectF, long)
*/
private RectF mMask;
/**
* 当前手势状态
*
* @see #getPinchMode()
* @see #PINCH_MODE_FREE
* @see #PINCH_MODE_SCROLL
* @see #PINCH_MODE_SCALE
*/
private int mPinchMode = PINCH_MODE_FREE;
/**
* 获取外部变换矩阵.
*
* 外部变换矩阵记录了图片手势操作的最终结果,是相对于图片fit center状态的变换.
* 默认值为单位矩阵,此时图片为fit center状态.
*
* @param matrix 用于填充结果的对象
* @return 如果传了matrix参数则将matrix填充后返回,否则new一个填充返回
*/
public Matrix getOuterMatrix(Matrix matrix) {
if (matrix == null) {
matrix = new Matrix(mOuterMatrix);
} else {
matrix.set(mOuterMatrix);
}
return matrix;
}
/**
* 获取内部变换矩阵.
*
* 内部变换矩阵是原图到fit center状态的变换,当原图尺寸变化或者控件大小变化都会发生改变
* 当尚未布局或者原图不存在时,其值无意义.所以在调用前需要确保前置条件有效,否则将影响计算结果.
*
* @param matrix 用于填充结果的对象
* @return 如果传了matrix参数则将matrix填充后返回,否则new一个填充返回
*/
public Matrix getInnerMatrix(Matrix matrix) {
if (matrix == null) {
matrix = new Matrix();
} else {
matrix.reset();
}
if (isReady()) {
//原图大小
RectF tempSrc = MathUtils.rectFTake(0, 0, getDrawable().getIntrinsicWidth(), getDrawable().getIntrinsicHeight());
//控件大小
RectF tempDst = MathUtils.rectFTake(0, 0, getWidth(), getHeight());
//计算fit center矩阵
matrix.setRectToRect(tempSrc, tempDst, Matrix.ScaleToFit.CENTER);
//释放临时对象
MathUtils.rectFGiven(tempDst);
MathUtils.rectFGiven(tempSrc);
}
return matrix;
}
/**
* 获取图片总变换矩阵.
*
* 总变换矩阵为内部变换矩阵x外部变换矩阵,决定了原图到所见最终状态的变换
* 当尚未布局或者原图不存在时,其值无意义.所以在调用前需要确保前置条件有效,否则将影响计算结果.
*
* @param matrix 用于填充结果的对象
* @return 如果传了matrix参数则将matrix填充后返回,否则new一个填充返回
*
* @see #getOuterMatrix(Matrix)
* @see #getInnerMatrix(Matrix)
*/
public Matrix getCurrentImageMatrix(Matrix matrix) {
//获取内部变换矩阵
matrix = getInnerMatrix(matrix);
//乘上外部变换矩阵
matrix.postConcat(mOuterMatrix);
return matrix;
}
/**
* 获取当前变换后的图片位置和尺寸
*
* 当尚未布局或者原图不存在时,其值无意义.所以在调用前需要确保前置条件有效,否则将影响计算结果.
*
* @param rectF 用于填充结果的对象
* @return 如果传了rectF参数则将rectF填充后返回,否则new一个填充返回
*
* @see #getCurrentImageMatrix(Matrix)
*/
public RectF getImageBound(RectF rectF) {
if (rectF == null) {
rectF = new RectF();
} else {
rectF.setEmpty();
}
if (!isReady()) {
return rectF;
} else {
//申请一个空matrix
Matrix matrix = MathUtils.matrixTake();
//获取当前总变换矩阵
getCurrentImageMatrix(matrix);
//对原图矩形进行变换得到当前显示矩形
rectF.set(0, 0, getDrawable().getIntrinsicWidth(), getDrawable().getIntrinsicHeight());
matrix.mapRect(rectF);
//释放临时matrix
MathUtils.matrixGiven(matrix);
return rectF;
}
}
/**
* 获取当前设置的mask
*
* @return 返回当前的mask对象副本,如果当前没有设置mask则返回null
*/
public RectF getMask() {
if (mMask != null) {
return new RectF(mMask);
} else {
return null;
}
}
/**
* 获取当前手势状态
*
* @see #PINCH_MODE_FREE
* @see #PINCH_MODE_SCROLL
* @see #PINCH_MODE_SCALE
*/
public int getPinchMode() {
return mPinchMode;
}
/**
* 与ViewPager结合的时候使用
* @param direction
* @return
*/
@Override
public boolean canScrollHorizontally(int direction) {
if (mPinchMode == PinchImageView.PINCH_MODE_SCALE) {
return true;
}
RectF bound = getImageBound(null);
if (bound == null) {
return false;
}
if (bound.isEmpty()) {
return false;
}
if (direction > 0) {
return bound.right > getWidth();
} else {
return bound.left < 0;
}
}
/**
* 与ViewPager结合的时候使用
* @param direction
* @return
*/
@Override
public boolean canScrollVertically(int direction) {
if (mPinchMode == PinchImageView.PINCH_MODE_SCALE) {
return true;
}
RectF bound = getImageBound(null);
if
没有合适的资源?快使用搜索试试~ 我知道了~
基于android的火灾逃生系统.zip
共121个文件
xml:56个
java:30个
png:8个
需积分: 5 0 下载量 175 浏览量
2024-03-09
11:14:05
上传
评论
收藏 1.8MB ZIP 举报
温馨提示
【项目资源】: 包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。 包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】: 适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】: 有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 鼓励下载和使用,并欢迎大家互相学习,共同进步。 # 注意 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。
资源推荐
资源详情
资源评论
收起资源包目录
基于android的火灾逃生系统.zip (121个子文件)
gradlew.bat 2KB
.gitignore 118B
.gitignore 7B
build.gradle 2KB
build.gradle 660B
settings.gradle 15B
gradlew 5KB
jcore-android_v1.1.0.jar 291KB
jpush-android_v3.0.1.jar 145KB
gradle-wrapper.jar 52KB
PinchImageView.java 58KB
MainActivity.java 16KB
PushSetActivity.java 10KB
SPUtils.java 6KB
RegisteredActivity.java 6KB
MyReceiver.java 5KB
SettingTimeActivity.java 5KB
FindPasswordActivity.java 4KB
LoginActivity.java 4KB
AddSafeContactsActivity.java 4KB
ContactInfoParser.java 4KB
PushUtil.java 3KB
ConfigUtils.java 3KB
ChangePasswordActivity.java 2KB
ContactAdapter.java 2KB
SettingsActivity.java 2KB
webViewActivity.java 2KB
CustomDialog.java 2KB
WebViewAdapter.java 2KB
UserManagerActivity.java 2KB
MyApplication.java 1KB
ToastUtils.java 1KB
TestActivity.java 1023B
UserEntity.java 1022B
ExampleInstrumentedTest.java 754B
HistoryUrl.java 727B
ContactInfo.java 574B
ConstantUtils.java 540B
ExampleUnitTest.java 403B
ViewHolder.java 270B
side_nav_bar.jpeg 298KB
login.jpg 88KB
login.jpg 88KB
login.jpg 88KB
login.jpg 88KB
login.jpg 88KB
test.jpg 52KB
default_avatar.png 26KB
ic_launcher.png 10KB
ic_launcher.png 8KB
ic_launcher.png 5KB
ic_launcher.png 3KB
ic_launcher.png 2KB
jpush_ic_richpush_actionbar_back.png 695B
jpush_ic_richpush_actionbar_divider.png 181B
proguard-rules.pro 648B
gradle.properties 730B
gradle-wrapper.properties 233B
libjcore110.so 204KB
libjcore110.so 166KB
libjcore110.so 130KB
libjcore110.so 129KB
libjcore110.so 126KB
libjcore110.so 81KB
libjcore110.so 77KB
test.xml 705KB
set_push_time.xml 9KB
AndroidManifest.xml 9KB
styles.xml 4KB
strings.xml 3KB
activity_registered.xml 3KB
activity_login.xml 3KB
misc.xml 3KB
jpush_webview_layout.xml 2KB
ic_push.xml 2KB
ic_contacts.xml 2KB
activity_find_password.xml 2KB
dialog_photo.xml 2KB
app_bar_main.xml 2KB
item_list_contact_select.xml 1KB
activity_change_password.xml 1KB
nav_header_main.xml 1KB
customer_notitfication_layout.xml 1017B
ic_settings.xml 1012B
colors.xml 985B
activity_main.xml 920B
jpush_richpush_btn_selector.xml 863B
dialog_loading.xml 816B
activity_web_view.xml 794B
activity_main_drawer.xml 772B
content_main.xml 762B
gradle.xml 711B
jpush_style.xml 690B
compiler.xml 686B
progress_small.xml 642B
set_tag_alis.xml 625B
dimens.xml 619B
drawables.xml 614B
ic_menu_camera.xml 601B
runConfigurations.xml 564B
共 121 条
- 1
- 2
资源评论
妄北y
- 粉丝: 1w+
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功