scrollView(下)

2024-09-05 13:32
文章标签 scrollview

本文主要是介绍scrollView(下),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这篇继续写scroll,不过这次不是用scrollView这个控件,而是自己编写一段代码实现拖动图片。假想有一张很大的地图,然后屏幕只能显示它的一角,这时候就要通过拖动来查看其他部分。本来是要用scrollView实现这个功能,可用起来始终那么别扭,这不,上午一气之下自己搞了个可以拖动图片的代码。


一、首先在init中添加自己要实现拖动到图片。

[cpp] view plain copy
  1. bool HelloWorld::init()  
  2. {  
  3.     bool bRet = false;  
  4.     do   
  5.     {  
  6.         CC_BREAK_IF(! CCLayer::init());  
  7.           
  8.         CCSize size = CCDirector::sharedDirector()->getWinSize();  
  9.   
  10.         //选择的图片一定要比screan 大,要不然就会出问题。不过话说回来,你的图片如果比屏幕小,你还拖动干嘛?找茬?  
  11.         sprite = CCSprite::create("map_bg.png");  
  12.         this->addChild(sprite);  
  13.         sprite->setPosition(ccp(size.width/2,size.height/2));  
  14.         sprite->setAnchorPoint(ccp(0.5,0.5));  
  15.   
  16.         //开启触摸  
  17.         setTouchEnabled(true);  
  18.   
  19.         bRet = true;  
  20.     } while (0);  
  21.   
  22.     return bRet;  
  23. }  

二、真正实现拖动图片的代码:
[cpp] view plain copy
  1. void HelloWorld::ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent)  
  2. {  
  3.     CCSetIterator it = pTouches->begin();  
  4.     CCTouch* touch = (CCTouch*)(*it);  
  5.   
  6.     //获取触摸开始的坐标  
  7.     m_tBeginPos = touch->getLocation();      
  8. }  
  9.   
  10. void HelloWorld::ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent)  
  11. {  
  12.     CCSetIterator it = pTouches->begin();  
  13.     CCTouch* touch = (CCTouch*)(*it);  
  14.   
  15.     CCSize size = CCDirector::sharedDirector()->getWinSize();  
  16.   
  17.     CCPoint touchLocation = touch->getLocation();  
  18.     float nMoveY = touchLocation.y - m_tBeginPos.y;  
  19.     float nMoveX = touchLocation.x - m_tBeginPos.x;  
  20.   
  21.     //sprite 的当前坐标  
  22.     CCPoint curPos  = sprite->getPosition();  
  23.     //下一个坐标就是sprite当前坐标+鼠标移动到距离  
  24.     CCPoint nextPos = ccp(curPos.x + nMoveX, curPos.y + nMoveY);  
  25.   
  26.     //最大移动距离!  
  27.     float maxMoveY = sprite->getContentSize().height/2 - size.height/2;  
  28.     float maxMoveX = sprite->getContentSize().width/2 - size.width/2;  
  29.   
  30.     sprite->setPosition(nextPos);  
  31.     m_tBeginPos = touchLocation;  
  32.   
  33.     //判断图片是否超出边界,切记,这下面两句一定要放在上面两句之后  
  34.     HelloWorld::judgeHV(nextPos,maxMoveY);  
  35.     HelloWorld::judgeLR(nextPos,maxMoveX);    
  36. }  

三、judgeHV跟judgeLR是为了防止图片被拖动出边界,出现黑边。
[cpp] view plain copy
  1. void HelloWorld::judgeHV(CCPoint nextPos,float max)  
  2. {  
  3.     CCSize size = CCDirector::sharedDirector()->getWinSize();  
  4.   
  5.     //因为在if里面return是不会影响外部的,只是函数停止执行而已,函数停止了,外面的代码照常运行~  
  6.     if (nextPos.y <(size.height/2-max))  
  7.     {  
  8.         //当移动到最顶端,Y坐标为maxMoveY,不让它动  
  9.         sprite->setPositionY(size.height/2-max);  
  10.         return;  
  11.     }  
  12.   
  13.     if(nextPos.y > (size.height/2 + max))  
  14.     {  
  15.         sprite->setPositionY(size.height/2 + max);  
  16.         return;  
  17.     }  
  18. }  
  19.   
  20. void HelloWorld::judgeLR(CCPoint nextPos,float max)  
  21. {  
  22.     CCSize size = CCDirector::sharedDirector()->getWinSize();  
  23.   
  24.     if(nextPos.x < (size.width/2 - max))  
  25.     {  
  26.         sprite->setPositionX(size.width/2 - max);  
  27.         return;  
  28.     }  
  29.   
  30.     if(nextPos.x > (size.width/2 + max))  
  31.     {  
  32.         sprite->setPositionX(size.width/2 + max);  
  33.         return;  
  34.     }     
  35. }  

恩,这样就成功了。简单吧。

这篇关于scrollView(下)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1139095

相关文章

兔子--计算listview的高度,解决listview与scrollview控件冲突

/** * 计算ListView的高度 * * @param listView */ public void setListViewHeightBasedOnChildren(ListView listView) { // 获取ListView对应的Adapter OrderGoodsAdapter listAdapter = (OrderGoodsAdapter) listView.getAda

ScrollView的android:fillViewport=true

http://stackoverflow.com/questions/2599837/linearlayout-not-expanding-inside-a-scrollview http://blog.csdn.net/linqingf/article/details/6573602 当fillViewport="true" 设置为 true里 , scrollV

ScrollView嵌套listview滑动位置底部bug

三种方案,个人推荐第三种: 1 sv.fullScroll(ScrollView.FOCUS_UP); 2 sv.setScrollY(0); 3 sv.smoothScrollTo(0,20); 滑动冲突解决listView: public class ListViewForScrollView extends ListView {public ListVie

cocos2d-x ScrollView(上)

scrollView 的调用问题困扰我很久,昨天才有时间继续研究这个,可惜最后还是没能完全解决它存在的问题。。。 看头文件: [cpp] view plain copy #ifndef __HELLOWORLD_SCENE_H__  #define __HELLOWORLD_SCENE_H__    #include "cocos2d.h"    #include "../..

ScrollView嵌套RecyclerView再嵌套RecyclerView导致的布局展示不完整问题

背景:页面布局,最外层有个ScrollView,然后里面有个RecyclerView,然后每个RecyclerView的item都是一个RecyclerView 异常:页面展示不完整,最底下的Item 展示一半,在往上滑就滑不动了   解决: // 每一个item渲染完后重新计算外层recyclerview高度// 因为外层的recyclerview是先渲染的,渲染时 内部recyc

ScrollView做的上拉效果

Java代码   import android.content.Context;  import android.util.AttributeSet;  import android.view.MotionEvent;  import android.widget.ScrollView;    public class MyScrollView extends ScrollVie

Android上实现弹性ScrollView

前言 IOS的UI和用户体验是它的优势, 与IOS相比, Android的UI和用户体验可能要差一些。 虽然Android版本已经到了4.4, 对系统的各个方法进行了大量实质性的优化, 但他的显示效果和交互体验依然不及IOS。 例如IOS上的很多控件都是带弹性的, 也就是拖拽一个控件到了该控件的边界, 但是控件依然可以随着手指的移动而移动一段距离。 这样的话, 给用户的感

解决ScrollView.setOnScrollChangeListener() API23问题;

解决ScrollView.setOnScrollChangeListener() API23以上可用问题; # 虽然现在很多人都是直接使用的RecycleView代替ScrollView,但今天我还是使用ScrollView. 1、首先自定义一个接口 public interface ScrollViewListener { void onScrollChanged(Observable

运项目难点之ScrollView中嵌套百度地图(BaiduMap)的解决方案

由于产品的需求,有时候不得不在ScrollView中嵌套百度地图(BaiduMap)。但是,嵌套之后会存在一些问题,两个比较突出的问题是:1)ScrollView中事件处理与BaiduMap存在冲突。2)在BaiduMap随着ScrollView拖动的时候,存在黑影问题。很多人遇到过这两个问题,也比较棘手,所以希望百度能给出官方的解决方案。下面说说我的处理办法。 1)ScrollView中事

ScrollView计时器循环滚动

MainActivity中代码如下,我都做了相关的注释,很清晰 package com.safly.myapplication;import android.animation.Animator;import android.animation.ObjectAnimator;import android.animation.ValueAnimator;import android.gr