锤子手机的图片缩放,怎么禁止图片ps放大镜细微缩放后自动还原

2136人阅读
Andrid-开源框(4)
首先扯点别的:昨天约人打拳皇,又被一顿海虐,也是艰难。万水千山总是情,虐我轻点行不行?八神用的越来越水了,昨天下午饭都没有胃口了。看样是时候退出拳皇97界了。
进入正题:今天说一个GITHUB上的一个开源的项目TouchImageView,链接地址如下:,今天的博客就照着github上的英文给大家翻译一下(我得为自己的560的四级,460的六级找个说法啊),顺便给大家展示一下demo,让大家看的更直观一点。
TouchImageView功能介绍:TouchImageView继承并涵盖了ImageView的所用功能。另外TouchImageView增加了双指缩放,拖拽,滑动,双击缩放的功能和其他动画效果。我们的目的是使TouchImageView的功能尽可能和那些展示图片的应用程序相似。
例子:请查看包括以下功能例子的应用示例应用程序
单个TouchImageView: 单个TouchImageView的基础使用,包括
OnTouchImageViewListener(触摸监听), getScrollPosition()(得到所放的中心位置), getZoomedRect()(得到缩放的矩形), isZoomed()(判断是否所放了),and getCurrentZoom()(得到当前的所放比).的使用。如果大家现在对这几个函数还没有什么概念很正常,坚持一下,继续往下看。
3.1,先看效果,再解释
3.2,这是主界面,点击 Single TouchImageView 进入到相应的活动
3.3Single TouchImageView Activity
可以进行双击缩放,双指缩放,拖拽的操作,我操做的效果如下(注意。你的操作效果跟我的不一样)
3.4 操作效果
ViewPager 的例子:多个TouchImageView放在ViewPager 里面,就像是展示图片的画廊app。
4.1 点击主界面的ViewPager Example进入到相应的界面,效果如下,可以左右滑动测试ViewPager的效果
4.2左右滑动改变图片
镜子效果:使用onTouchImageViewListener and setZoom()使两个TouchImageView的展示效果相同。
5.1 点击主界面的Mirroring Example 进入相应的界面,一张图片的所有手势效果会被同样应用在另外一张图片上,你点击放大上面的一张图片,下面的图片就会跟着放大。
更换图片的例子
6.1 点击TouchImageView更换图片,注意图片的缩放状态会被保持。就是说如果当前图片没有缩放点击更换下一张图片也不会缩放,如果当前的图片放大了,点击更换下一张图片也会被放大,看效果
更换图片缩放类型的例子:点击图片更换支持的图片的缩放效果(关于缩放效果的文章可以看看这个),行看看更换缩放类型的图片效果,就看两个。
以下是关于TouchImageView的一些说明
限制:TouchImageView不支持手势旋转,另外FIT_START 和FIT_END现在还不支持。
支持最小API 8.
使用方式:把TouchImageView.java复制到你的工程里,就可以像ImageView一样使用了,例如
TouchImageView img = (TouchImageView) findViewById(R.id.img);
如果你在xml文件里使用,那你必须使用完整的包名,因为TouchImageView 是一个自定义view。
android:id="@+id/img”
android:layout_width="match_parent"
android:layout_height="match_parent" /&
float getCurrentZoom();
float getMaxZoom();
float getMinZoom();
PointF getScrollPosition();
RectF getZoomedRect();
boolean isZoomed();
void resetZoom();
void setMaxZoom(float max);
void setMinZoom(float min);
void setScrollPosition(float focusX, float focusY);
void setZoom(float scale);
三个参数分别表示;缩放级别,横纵坐标。
void setZoom(float scale, float focusX, float focusY);
四个参数分别表示;缩放级别,横纵坐标,缩放类型。
void setZoom(float scale, float focusX, float focusY, ScaleType scaleType);
void setZoom(TouchImageView img);
centerCrop,centerInside,fitXY,fitCenter,center。
实话是说。翻译还是借助了有道词典,学了十几年的英语,都忘的差不多了,就会说一个Hello,Hi了,艰难。写的不好,大家多多包涵。
结尾:我们专业的学安卓的有在上海的。北京的。杭州的。工资有15000的,10000的。但是我们专业学安卓的还有在青岛即墨的。工资2000,就是我,也是艰难啊。还有2,3个月就毕业了,该考虑一下到底何去何从了。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:74067次
积分:1438
积分:1438
排名:千里之外
原创:70篇
评论:11条
(1)(5)(9)(3)(4)(2)(5)(1)(3)(10)(7)(2)(2)(12)(4)(2)(2)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'图片大小缩放的问题,放大之后再缩小,没有回去。-CSDN论坛
图片大小缩放的问题,放大之后再缩小,没有回去。
图片大小缩放的问题,放大之后再缩小,没有回去。
void&CMyGraphCuts01View::OnZoomIn()
if&(m_scale&&&5)
m_scale&++;
CFrameWnd*&pFrame&=&GetParentFrame();
pFrame-&GetWindowRect(rect);
rect.right&=&rect.left&+&m_width&*&m_
rect.bottom&=&rect.top&+&m_height&*&m_
pFrame-&CalcWindowRect(rect);
pFrame-&MoveWindow(0,0,rect.Width(),&rect.Height());
Invalidate(0);
void&CMyGraphCuts01View::OnZoomOut()
if&(m_scale&&&1)
m_scale&--;
CFrameWnd*&pFrame&=&GetParentFrame();
pFrame-&GetWindowRect(rect);
rect.right&=&rect.left&+&m_width&*&m_
rect.bottom&=&rect.top&+&m_height&*&m_
pFrame-&CalcWindowRect(rect);
pFrame-&MoveWindow(0,0,rect.Width(),&rect.Height());
Invalidate(0);
请问高手,还需要怎么搞一下?
是你OnDraw绘图有问题吧,先用默认背景色填充整个Client区域,FillSolidRect(),然后再StretchBlt()贴图
Invalidate(1);&
引用&2&楼&VisualEleven&的回复:是你OnDraw绘图有问题吧,先用默认背景色填充整个Client区域,FillSolidRect(),然后再StretchBlt()贴图
高手,原来作者的效果是这样的:
我的是这样的:
怎么让这个客户区窗口自动适应图片呢?
你是怎么响应这些逻辑代码的?通过鼠标拖动自由拉伸还是,你要处理就是打开图片,自动让客户端适应图片的大小?
就贴这些逻辑代码没法解决。贴出事件处理代码。
每个放大和缩小操作都应该基于原图,&
估计你不是.
比如一个图A,&&&放大2倍变成B,&&你又将B放大2倍变成C.&&又将C缩小2倍变成D(你以为会变成B),&&又将D缩小2倍变成E(你以为会变成A).
实际上应该这样做.
A&放大2倍变成B&
A放大4倍变成C
A放大2倍变成D
即所有操作都要基于原图.&&而不是变换后的图.&
如果你问为什么??
&那是因为,&任何缩放算法都是会有损的,&即缩放都是在破坏原图,&&这时你想恢复回来,&那就是破镜重圆---不可能.
引用&7&楼&xiaohuh421&的回复:每个放大和缩小操作都应该基于原图,&
估计你不是.
比如一个图A,&&&放大2倍变成B,&&你又将B放大2倍变成C.&&又将C缩小2倍变成D(你以为会变成B),&&又将D缩小2倍变成E(你以为会变成A).
实际上应该这样做.
A&放大2倍变成B&
A放大4倍变成C
A放大2倍变成D
即所有操作都要基于原图.&&而不是变换后的图.&
如果你问为什么??
&那是因为,&任何缩放算法都是会有损的,&即缩放都是在破坏原图,&&这时你想恢复回来,&那就是破镜重圆---不可能.
我也是,读别人的代码,我看这个代码就没有对图片进行操作啊,直接操作的是窗口。
这个zoomin函数就是点击放大按钮时候的响应函数啊。
void&CMyGraphCuts01View::OnZoomIn()
if&(m_scale&&&5)
m_scale&++;
CFrameWnd*&pFrame&=&GetParentFrame();
pFrame-&GetWindowRect(rect);
rect.right&=&rect.left&+&m_width&*&m_
rect.bottom&=&rect.top&+&m_height&*&m_
pFrame-&CalcWindowRect(rect);
pFrame-&MoveWindow(0,0,rect.Width(),&rect.Height());
Invalidate(0);
void&CMyGraphCuts01View::OnZoomOut()
if&(m_scale&&&1)
m_scale&--;
CFrameWnd*&pFrame&=&GetParentFrame();
pFrame-&GetWindowRect(rect);
rect.right&=&rect.left&+&m_width&*&m_
rect.bottom&=&rect.top&+&m_height&*&m_
pFrame-&CalcWindowRect(rect);
pFrame-&MoveWindow(0,0,rect.Width(),&rect.Height());
Invalidate(0);
引用&6&楼&bojie5744&的回复:就贴这些逻辑代码没法解决。贴出事件处理代码。
我贴的就是放大缩小的事件处理啊。
//&MyGraphCuts0.1View.cpp&:&CMyGraphCuts01View&类的实现
#include&"stdafx.h"
//&SHARED_HANDLERS&可以在实现预览、缩略图和搜索筛选器句柄的
//&ATL&项目中进行定义,并允许与该项目共享文档代码。
#ifndef&SHARED_HANDLERS
#include&"MyGraphCuts0.1.h"
#include&"MyGraphCuts0.1Doc.h"
#include&"MyGraphCuts0.1View.h"
#include&"CvvImage.h"
#ifdef&_DEBUG
#define&new&DEBUG_NEW
#ifndef&DELETE_SAFE
#define&DELETE_SAFE(x)&{if&((x))&delete&[](x);&(x)=NULL;}
//&CMyGraphCuts01View
IMPLEMENT_DYNCREATE(CMyGraphCuts01View,&CView)
BEGIN_MESSAGE_MAP(CMyGraphCuts01View,&CView)
//&标准打印命令
ON_COMMAND(ID_FILE_PRINT,&&CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT,&&CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW,&&CMyGraphCuts01View::OnFilePrintPreview)
ON_WM_CONTEXTMENU()
ON_WM_RBUTTONUP()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
ON_WM_RBUTTONDOWN()
ON_WM_RBUTTONUP()
ON_COMMAND(ID_BUTTON_ZOOMIN,&OnZoomIn)
ON_COMMAND(ID_BUTTON_ZOOMOUT,&OnZoomOut)
ON_WM_TIMER()
ON_WM_CTLCOLOR()
END_MESSAGE_MAP()
//&CMyGraphCuts01View&构造/析构
CMyGraphCuts01View::CMyGraphCuts01View()
//&TODO:&在此处添加构造代码
m_image&=&NULL;
m_scale&=&1;
m_isDraw&=&
m_stateBuffer&=&&m_state1B
CMyGraphCuts01View::~CMyGraphCuts01View()
BOOL&CMyGraphCuts01View::PreCreateWindow(CREATESTRUCT&&cs)
//&TODO:&在此处通过修改
//&&CREATESTRUCT&cs&来修改窗口类或样式
return&CView::PreCreateWindow(cs);
//&CMyGraphCuts01View&绘制
void&CMyGraphCuts01View::OnDraw(CDC*&pDC/*pDC*/)
CMyGraphCuts01Doc*&pDoc&=&GetDocument();
ASSERT_VALID(pDoc);
if&(!pDoc)
m_stateBuffer-&drawDC(m_swapBuffer.GetDC(),0,0);
m_swapBuffer.strechDC(pDC,0,0,m_scale);
//&TODO:&add&draw&code&for&native&data&here
//& CvvImage&&&img=&pDoc-&m_
//& if&(img.GetImage()!=0)
img.Show(pDC-&GetSafeHdc(),0,0,img.GetImage()-&width,img.GetImage()-&height,0,0);
//&TODO:&在此处为本机数据添加绘制代码
//消息处理
void&CMyGraphCuts01View::OnInitialUpdate()
CView::OnInitialUpdate();
CMyGraphCuts01Doc*&pDoc&=&GetDocument();
if&(pDoc-&m_IsFileLoad)&
CString&file&=&pDoc-&GetPathName();
if&(!img.Load(file))
MessageBox("无法打开文件",NULL,&MB_ICONSTOP|MB_OK);
pDoc-&m_IsFileLoad&=&
m_width&=&img.Width();
m_height&=&img.Height();
m_originalBuffer.initialize(m_width,&m_height);
m_state1Buffer.initialize(m_width,&m_height);
m_state2Buffer.initialize(m_width,&m_height);
m_swapBuffer.initialize(m_width,&m_height);
CRect&rect(0,0,m_width,m_height);
img.DrawToHDC(m_originalBuffer.GetDC()-&m_hDC,rect);
img.DrawToHDC(m_state1Buffer.GetDC()-&m_hDC,rect);
img.DrawToHDC(m_state2Buffer.GetDC()-&m_hDC,rect);
CFrameWnd*&pFrame&=&GetParentFrame();
pFrame-&CalcWindowRect(rect);
rect.MoveToXY(0,0);
pFrame-&MoveWindow(rect);
int&size&=&m_width&*&img.Height()&*&3;
DELETE_SAFE(m_image);
m_image&=&new&BYTE[size];
BYTE*&src&=&(BYTE*)&img.GetImage()-&imageD
int&widthStep&=&img.GetImage()-&widthS
int&width3&=&m_width&*&3;
for&(int&i=0;i&m_i++)&
for&(int&j=0;j&width3;j++)
m_image[i*width3+j]&=&src[i*widthStep+j];
//m_maskManager.initMask(m_width,&m_height,&CGrabcutModel::UND&);
//m_graphModel.setImage(m_image,&m_width,&m_height&);
//m_graphModel.setMask(m_maskManager.getMask());
SetTimer(1,&1000,&NULL);
//周期性触发
//&CMyGraphCuts01View&打印
void&CMyGraphCuts01View::OnFilePrintPreview()
#ifndef&SHARED_HANDLERS
AFXPrintPreview(this);
BOOL&CMyGraphCuts01View::OnPreparePrinting(CPrintInfo*&pInfo)
//&默认准备
return&DoPreparePrinting(pInfo);
void&CMyGraphCuts01View::OnBeginPrinting(CDC*&/*pDC*/,&CPrintInfo*&/*pInfo*/)
//&TODO:&添加额外的打印前进行的初始化过程
void&CMyGraphCuts01View::OnEndPrinting(CDC*&/*pDC*/,&CPrintInfo*&/*pInfo*/)
//&TODO:&添加打印后进行的清理过程
void&CMyGraphCuts01View::OnContextMenu(CWnd*&/*&pWnd&*/,&CPoint&point)
#ifndef&SHARED_HANDLERS
theApp.GetContextMenuManager()-&ShowPopupMenu(IDR_POPUP_EDIT,&point.x,&point.y,&this,&TRUE);
//&CMyGraphCuts01View&诊断
#ifdef&_DEBUG
void&CMyGraphCuts01View::AssertValid()&const
CView::AssertValid();
void&CMyGraphCuts01View::Dump(CDumpContext&&dc)&const
CView::Dump(dc);
CMyGraphCuts01Doc*&CMyGraphCuts01View::GetDocument()&const&//&非调试版本是内联的
ASSERT(m_pDocument-&IsKindOf(RUNTIME_CLASS(CMyGraphCuts01Doc)));
return&(CMyGraphCuts01Doc*)m_pD
#endif&//_DEBUG
//&CMyGraphCuts01View&消息处理程序
void&CMyGraphCuts01View::OnLButtonDown(UINT&nFlags,&CPoint&point)
m_isDraw&=&
SetCapture();
CView::OnLButtonDown(nFlags,&point);
void&CMyGraphCuts01View::OnLButtonUp(UINT&nFlags,&CPoint&point)
ReleaseCapture();
CView::OnLButtonUp(nFlags,&point);
void&CMyGraphCuts01View::OnRButtonDown(UINT&nFlags,&CPoint&point)
m_isDraw&=&
//The&return&value&is&a&handle&to&the&window&that&had&previously&captured&the&mouse.
SetCapture();
CView::OnRButtonDown(nFlags,&point);
void&CMyGraphCuts01View::OnRButtonUp(UINT&nFlags,&CPoint&point)
CView::OnRButtonUp(nFlags,&point);
void&CMyGraphCuts01View::OnMouseMove(UINT&nFlags,&CPoint&point)
CView::OnMouseMove(nFlags,&point);
point.x&/=&m_
point.y&/=&m_
if&(!&m_isDraw)&
else&if&(!(nFlags&&&MK_LBUTTON)&&&&!(nFlags&&&MK_RBUTTON)&)
ReleaseCapture();
m_isDraw&=&
}&else&if&(nFlags&&&MK_LBUTTON)&
m_state1Buffer.setPixel(point.x,&point.y,&5,&RGB(0,0,255));
m_state2Buffer.setPixel(point.x,&point.y,&5,&RGB(0,0,255));
//m_maskManager.setMask(point.x,&point.y,&5,&CGrabcutModel::OBJ);
m_state1Buffer.setPixel(point.x,&point.y,&5,&RGB(255,0,0));
m_state2Buffer.setPixel(point.x,&point.y,&5,&RGB(255,0,0));
//m_maskManager.setMask(point.x,&point.y,&5,&CGrabcutModel::BKG);
Invalidate(0);
void&CMyGraphCuts01View::OnTimer(UINT&nIDEvent)
//&TODO:&Add&your&message&handler&code&here&and/or&call&default
switch(nIDEvent)&
if&(m_stateBuffer&==&&m_state1Buffer)
m_stateBuffer&=&&m_state2B
m_stateBuffer&=&&m_state1B
Invalidate(0);
CView::OnTimer(nIDEvent);
HBRUSH&CMyGraphCuts01View::OnCtlColor(CDC*&pDC,&CWnd*&pWnd,&UINT&nCtlColor)
HBRUSH&hbr&=&CView::OnCtlColor(pDC,&pWnd,&nCtlColor);
//&TODO:&&Change&any&attributes&of&the&DC&here
//在MFC类库提供了CWnd::OnCtlColor函数,在工作框架的子窗口被重画时将调用该成员函数
//&TODO:&&Return&a&different&brush&if&the&default&is&not&desired
void&CMyGraphCuts01View::OnZoomIn()
if&(m_scale&&&5)
m_scale&++;
CFrameWnd*&pFrame&=&GetParentFrame();
pFrame-&GetWindowRect(rect);
rect.right&=&rect.left&+&m_width&*&m_
rect.bottom&=&rect.top&+&m_height&*&m_
pFrame-&CalcWindowRect(rect);
pFrame-&MoveWindow(0,0,rect.Width(),&rect.Height());
Invalidate(0);
void&CMyGraphCuts01View::OnZoomOut()
if&(m_scale&&&1)
m_scale&--;
CFrameWnd*&pFrame&=&GetParentFrame();
pFrame-&GetWindowRect(rect);
rect.right&=&rect.left&+&m_width&*&m_
rect.bottom&=&rect.top&+&m_height&*&m_
pFrame-&CalcWindowRect(rect);
pFrame-&MoveWindow(0,0,rect.Width(),&rect.Height());
Invalidate(0);
回复

我要回帖

更多关于 zepto图片放大缩放 的文章

 

随机推荐