package com.lzy.imagepicker.view;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PointF;
import android.graphics.RectF;
import android.graphics.Region;
import android.graphics.Shader;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.support.v4.view.ViewCompat;
import android.support.v7.widget.AppCompatImageView;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.MotionEvent;
import com.lzy.imagepicker.R;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
/**
* ================================================
* 作 者:廖子尧
* 版 本:1.0
* 创建日期:2016/1/7
* 描 述:
* Matrix 的9个值分别为 缩放 平移 倾斜
* MSCALE_X MSKEW_X MTRANS_X
* MSKEW_Y MSCALE_Y MTRANS_Y
* MPERSP_0 MPERSP_1 MPERSP_2
* 修订历史:
* ================================================
*/
public class CropImageView extends AppCompatImageView {
/******************************** 中间的FocusView绘图相关的参数 *****************************/
public enum Style {
RECTANGLE, CIRCLE
}
private Style[] styles = {Style.RECTANGLE, Style.CIRCLE};
private int mMaskColor = 0xAF000000; //暗色
private int mBorderColor = 0xAA808080; //焦点框的边框颜色
private int mBorderWidth = 1; //焦点边框的宽度(画笔宽度)
private int mFocusWidth = 250; //焦点框的宽度
private int mFocusHeight = 250; //焦点框的高度
private int mDefaultStyleIndex = 0; //默认焦点框的形状
private Style mStyle = styles[mDefaultStyleIndex];
private Paint mBorderPaint = new Paint();
private Path mFocusPath = new Path();
private RectF mFocusRect = new RectF();
/******************************** 图片缩放位移控制的参数 ************************************/
private static final float MAX_SCALE = 4.0f; //最大缩放比,图片缩放后的大小与中间选中区域的比值
private static final int NONE = 0; // 初始化
private static final int DRAG = 1; // 拖拽
private static final int ZOOM = 2; // 缩放
private static final int ROTATE = 3; // 旋转
private static final int ZOOM_OR_ROTATE = 4; // 缩放或旋转
private static final int SAVE_SUCCESS = 1001; // 缩放或旋转
private static final int SAVE_ERROR = 1002; // 缩放或旋转
private int mImageWidth;
private int mImageHeight;
private int mRotatedImageWidth;
private int mRotatedImageHeight;
private Matrix matrix = new Matrix(); //图片变换的matrix
private Matrix savedMatrix = new Matrix(); //开始变幻的时候,图片的matrix
private PointF pA = new PointF(); //第一个手指按下点的坐标
private PointF pB = new PointF(); //第二个手指按下点的坐标
private PointF midPoint = new PointF(); //两个手指的中间点
private PointF doubleClickPos = new PointF(); //双击图片的时候,双击点的坐标
private PointF mFocusMidPoint = new PointF(); //中间View的中间点
private int mode = NONE; //初始的模式
private long doubleClickTime = 0; //第二次双击的时间
private double rotation = 0; //手指旋转的角度,不是90的整数倍,可能为任意值,需要转换成level
private float oldDist = 1; //双指第一次的距离
private int sumRotateLevel = 0; //旋转的角度,90的整数倍
private float mMaxScale = MAX_SCALE;//程序根据不同图片的大小,动态得到的最大缩放比
private boolean isInited = false; //是否经过了 onSizeChanged 初始化
private boolean mSaving = false; //是否正在保存
private static Handler mHandler = new InnerHandler();
public CropImageView(Context context) {
this(context, null);
}
public CropImageView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public CropImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
mFocusWidth = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, mFocusWidth, getResources().getDisplayMetrics());
mFocusHeight = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, mFocusHeight, getResources().getDisplayMetrics());
mBorderWidth = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, mBorderWidth, getResources().getDisplayMetrics());
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CropImageView);
mMaskColor = a.getColor(R.styleable.CropImageView_cropMaskColor, mMaskColor);
mBorderColor = a.getColor(R.styleable.CropImageView_cropBorderColor, mBorderColor);
mBorderWidth = a.getDimensionPixelSize(R.styleable.CropImageView_cropBorderWidth, mBorderWidth);
mFocusWidth = a.getDimensionPixelSize(R.styleable.CropImageView_cropFocusWidth, mFocusWidth);
mFocusHeight = a.getDimensionPixelSize(R.styleable.CropImageView_cropFocusHeight, mFocusHeight);
mDefaultStyleIndex = a.getInteger(R.styleable.CropImageView_cropStyle, mDefaultStyleIndex);
mStyle = styles[mDefaultStyleIndex];
a.recycle();
//只允许图片为当前的缩放模式
setScaleType(ScaleType.MATRIX);
}
@Override
public void setImageBitmap(Bitmap bm) {
super.setImageBitmap(bm);
initImage();
}
@Override
public void setImageDrawable(Drawable drawable) {
super.setImageDrawable(drawable);
initImage();
}
@Override
public void setImageResource(int resId) {
super.setImageResource(resId);
initImage();
}
@Override
public void setImageURI(Uri uri) {
super.setImageURI(uri);
initImage();
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
isInited = true;
initImage();
}
/** 初始化图片和焦点框 */
private void initImage() {
Drawable d = getDrawable();
if (!isInited || d == null) return;
mode = NONE;
matrix = getImageMatrix();
mImageWidth = mRotatedImageWidth = d.getIntrinsicWidth();
mImageHeight = mRotatedImageHeight = d.getIntrinsicHeight();
//计算出焦点框的中点的坐标和上、下、左、右边的x或y的值
int viewWidth = getWidth();
int viewHeight = getHeight();
float midPointX = viewWidth / 2;
float midPointY = viewHeight / 2;
mFocusMidPoint = new PointF(midPointX, midPointY);
if (mStyle == Style.CIRCLE) {
int focusSize = Math.min(mFocusWidth, mFocusHeight);
mFocusWidth = focusSize;
mFocusHeight = focusSize;
}
mFocusRect.left = mFocusMidPoint.x - mFocusWidth / 2;
mFocusRect.right = mFocusMidPoint.x + mFocusWidth / 2;
mFocusRect.top = mFocusMidPoint.y - mFocusHeight / 2;
mFocusRect.bottom = mFocusMidPoint.y + mFocusHeight / 2;
//适配焦点框的缩放比例(图片的最小边不小于焦点框的最小边)
float fitFocusScale = getScale(mImageWidth, mImageHeight, mFocusWidth, mFocusHeight, true);
mMaxScale = fitFocusScale * MAX_SCALE;
//适配显示图片的ImageView的缩放比例(图片至少有一边是铺满屏幕的显示的情形)
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
Android 项目是使用 Android 操作系统和相关开发工具开发的一款移动应用程序。Android 平台提供了丰富的功能和接口,开发人员可以使用 Java 或 Kotlin 等编程语言编写 Android 应用程序。Android 项目也可以是针对特定设备或特定需求进行自定义开发的软件解决方案。 以下是 Android 项目的一些主要特点和资料介绍: 1. 开放源代码:Android 是基于 Linux 内核的开源操作系统,开发人员可以自由获取、使用和修改源代码。 2. 多样化的硬件设备支持:Android 支持多种硬件设备和屏幕尺寸,可以运行于手机、平板电脑、电视、手表等多种设备上。 3. 灵活的用户界面:Android 提供了丰富的用户界面控件和布局方式,可以实现漂亮、个性化的用户界面。 4. 响应式设计:Android 应用程序可以根据设备类型、屏幕尺寸等因素调整布局和显示方式,以适应不同的设备和用户需求。 5. 多媒体支持:Android 支持常见的音频、视频、图像等多媒体格式,可以实现各种多媒体应用。 6. 数据存储:Android 提供了多种数据存储方式,包括 SQLite 数据库、文件存储、SharedPreferences 等。 7. 网络通信:Android 支持多种网络通信方式,包括 HTTP、TCP、UDP 等。 8. 社交媒体集成:Android 提供了集成社交媒体的功能,可以实现与 Facebook、Twitter、Google+ 等社交媒体的交互。 # 注意 1. 本资源仅用于开源学习和技术交流。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。 3. 不可商用,一切后果由使用者承担。
资源推荐
资源详情
资源评论
收起资源包目录
Android Diary日记系统.zip (344个子文件)
imagepicker.aar 117KB
gradlew.bat 2KB
.gitattributes 378B
.gitignore 137B
.gitignore 7B
.gitignore 7B
build.gradle 4KB
config.gradle 3KB
build.gradle 974B
build.gradle 645B
settings.gradle 30B
gradlew 5KB
gradle-wrapper.jar 53KB
CropImageView.java 29KB
WheelView.java 23KB
SystemBarTintManager.java 20KB
HotspotDetailActivity.java 19KB
ImageGridActivity.java 17KB
TitleBar.java 15KB
ImagePicker.java 13KB
DiaryInfoActivity.java 10KB
ImagePreviewActivity.java 10KB
MyFragment.java 9KB
UserInfoActivity.java 9KB
VerificationUtils.java 9KB
CommentExpandAdapter.java 9KB
AbstractWheelTextAdapter.java 8KB
RecordInfoActivity.java 8KB
HotspotPresenter.java 8KB
RegisterActivity.java 8KB
DateSelectView.java 8KB
ImageRecyclerAdapter.java 8KB
ApiService.java 8KB
CorrelateActivity.java 7KB
PictureCompressUtil.java 7KB
WheelScroller.java 7KB
ImageDataSource.java 7KB
HotspotActivity.java 7KB
HotspotInfoActivity.java 7KB
RecordActivity.java 7KB
CalendarFragment.java 6KB
CorrelateAllActivity.java 6KB
HotspotFragment.java 6KB
DateUtils.java 5KB
SharedPreferencesUtil.java 5KB
FolderPopUpWindow.java 5KB
ImagePreviewDelActivity.java 5KB
ImageCropActivity.java 5KB
HomeFragment.java 4KB
RecordAdapter.java 4KB
MyApplication.java 4KB
LoginActivity.java 4KB
BaseActivity.java 4KB
ImagePreviewBaseActivity.java 4KB
Utils.java 4KB
NumericWheelAdapter.java 4KB
ImageFolderAdapter.java 4KB
SingleSelectView.java 3KB
WheelRecycle.java 3KB
NotePresenter.java 3KB
HttpModule.java 3KB
BitmapUtil.java 3KB
CustomItemView.java 3KB
SettingActivity.java 3KB
HomeAdapter.java 3KB
NavigationBarChangeListener.java 3KB
UIUtils.java 3KB
MainActivity.java 3KB
RecordPresenter.java 3KB
SimpleInputDialog.java 3KB
HotspotModel.java 3KB
ImagePickerAdapter.java 3KB
CorrelatePresenter.java 3KB
UserPresenter.java 3KB
CorrelateAdapter.java 3KB
ImagePageAdapter.java 3KB
CommentExpandableListView.java 3KB
BaseFragment.java 3KB
ImageItem.java 3KB
GlideUtils.java 3KB
MyZoomMediaLoader.java 2KB
ImageBaseActivity.java 2KB
MD5Utils.java 2KB
UserBean.java 2KB
SimpleRemoveConfirmDialog.java 2KB
HotspotContract.java 2KB
DiaryTitlePopup.java 2KB
CustomTitleItemView.java 2KB
AbstractWheelAdapter.java 2KB
SimpleConfirmDialog.java 2KB
HotspotBean.java 2KB
RxHttpResponseCompat.java 2KB
CommentBean.java 2KB
WheelViewAdapter.java 2KB
RegisterPresenter.java 2KB
SplashActivity.java 2KB
ReceivedCookiesInterceptor.java 2KB
HotspotAdapter.java 2KB
ItemsRange.java 2KB
GlideImageLoader.java 2KB
共 344 条
- 1
- 2
- 3
- 4
资源评论
阿齐Archie
- 粉丝: 9921
- 资源: 2300
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功