iTouchSlide--一个触屏及pc端手动拖曳的图片轮换控件

本文介绍如何通过CSS3的translate属性实现类似touchslide的图片拖动效果,并且提供了项目开源及演示地址。

前言

很多时候在触屏设备上面都需要用到触摸图片跟着滚动的效果。试过很多插件效果都不理想,而touchslide是很好的插件,但是每次用总是会出各种各样的问题,而且pc端也没办法用touchslide,于是我发现,还是自己花点时间写一个类似的吧。

原理

知识点1:假如大家看过css3的话那么就可以知道translate的作用了,没看过的话可以稍微去查一查,多了解总有好处,translate可以将页面上的元素根据x y z轴来移动,但是既然只是拖动,我们只需要移动x轴就可以了;
知识点2:仿照磁铁的计算。假如大家用过其他图片移动插件的话,那么可以发现,假如你将图片拖动到不上不下,其中一个图片的中间位置,那么拖动完以后图片会有一个返回到自己边缘对齐起点或重点的动画的,假如是第一张图片拖动到远离起点的地方,那么它还是会返回起点的;
知识点3:缓动动画效果位置的计算,请参考tween.js

实际效果

这里写图片描述

项目开源及演示地址

iTouchSlide

在C++ MFC中实现将一个LIST控件中的文件夹拖曳到另一个LIST控件中,可以通过以下步骤完成: 1. **初始化拖拽操作**: - 在源LIST控件中设置拖拽属性。 - 处理`LVN_BEGINDRAG`消息,初始化拖拽操作。 2. **处理拖拽数据**: - 在拖拽操作中,准备要传递的数据(例如,文件夹路径)。 - 使用`CImageList`创建一个拖拽图像。 3. **处理目标控件的拖拽事件**: - 在目标LIST控件中处理`LVN_BEGINDRAG`消息。 - 处理`WM_DROPFILES`消息,将拖拽的文件夹添加到目标LIST控件中。 以下是一个简单的示例代码,展示了如何实现上述步骤: ```cpp // 初始化源LIST控件的拖拽操作 void CMyDialog::InitDragList(CListCtrl* pListCtrl) { pListCtrl->DragAcceptFiles(TRUE); pListCtrl->ModifyStyle(0, LVS_REPORT | LVS_EDITLABELS | LVS_SHOWSELALWAYS); } // 处理源LIST控件的拖拽事件 void CMyDialog::OnLvnBegindragListSource(NMHDR *pNMHDR, LRESULT *pResult) { LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR); // 获取选中的项 int nItem = pNMLV->iItem; CString strFolder = pListCtrlSource->GetItemText(nItem, 0); // 创建一个图像列表 CImageList* pImageList = new CImageList; pImageList->Create(pListCtrlSource->GetItemWidth(), pListCtrlSource->GetItemHeight(), ILC_COLOR24, 1, 1); pImageList->Add(pListCtrlSource->GetItemBitmap(nItem)); CPoint ptAction(pNMLV->ptAction); pImageList->BeginDrag(0, CPoint(0, 0)); pImageList->DragEnter(pListCtrlSource->GetParent(), ptAction); // 开始拖拽 m_pDragImageList = pImageList; m_bDragging = TRUE; *pResult = 0; } // 处理目标LIST控件的拖拽事件 void CMyDialog::OnLvnBegindragListTarget(NMHDR *pNMHDR, LRESULT *pResult) { LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR); // 获取拖拽的文件夹路径 CString strFolder = m_strDragFolder; // 添加到目标LIST控件 int nItem = pListCtrlTarget->InsertItem(0, strFolder); *pResult = 0; } // 处理拖拽完成事件 void CMyDialog::OnLButtonUp(UINT nFlags, CPoint point) { if (m_bDragging) { m_bDragging = FALSE; m_pDragImageList->DragLeave(this); m_pDragImageList->EndDrag(); delete m_pDragImageList; m_pDragImageList = NULL; } CListCtrl::OnLButtonUp(nFlags, point); } // 处理拖拽中的鼠标移动事件 void CMyDialog::OnMouseMove(UINT nFlags, CPoint point) { if (m_bDragging) { CPoint pt(point); ClientToScreen(&pt); m_pDragImageList->DragMove(pt); } CListCtrl::OnMouseMove(nFlags, point); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值