如何在Android cocos 2d中添加ScrollView?

时间:2013-09-18 10:27:26

标签: android scrollview cocos2d-android

我正在使用Android cocos 2d,我有8-10个CCSprites,必须通过点击每个精灵水平滚动它们是下一个CCLayer加载所以需要在CCLayer中添加ScrollView但是我没有得到如何做到这一点我我正在使用cocos2d-android.jar

我正在使用此代码但无法正常工作: -

final Activity mActivity=CCDirector.sharedDirector().getActivity();

        final View view= LayoutInflater.from(mActivity).inflate(R.layout.level_scroll,null);

        mActivity.runOnUiThread(new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            mActivity.addContentView(view, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));

        }
        });

4 个答案:

答案 0 :(得分:2)

这是你必须添加所有精灵的图层:

public class ItemScrollLayer extends CCLayer{

        ArrayList<ExtraProjectileData> spirtes;
        float scaleX,scaleY;
        public ItemScrollLayer(float scaleX,float scaleY,ArrayList<ExtraProjectileData> sprites,float screensize)
        {
            this.scaleX = scaleX;
            this.scaleY = scaleY;
            this.spirtes = sprites;

            float horizontal_distance = 140*scaleX;


            for(int i = 0;i<sprites.size();i++)
            {
                CCSprite indi_sprite = sprites.get(i).getProjectile();
                indi_sprite.setScale(GameActivity.aspect_Scale(indi_sprite, scaleX, scaleY));

                indi_sprite.setPosition(horizontal_distance+(i*screensize),150*scaleY);
                addChild(indi_sprite);
            }
        }
    }

在我的MainLayer的Touch上移动图层的代码:

@Override
    public boolean ccTouchesMoved(MotionEvent event)
    {

        System.out.println("Touches Moved Called for UpgradeMenu");
        CGPoint LocationMoved = CCDirector.sharedDirector().convertToGL(CGPoint.make(event.getX(), event.getY()));
        float difference = LocationMoved.x - PrevTouchLocation.x;

        float posX = scroll_layer.getPosition().x + difference;
        scroll_layer.setPosition(CGPoint.make(posX, 0));
        if(posX > 0){
            scroll_layer.setPosition(CGPoint.zero());
        }
        else if(posX < (-size.width)*(sprites.size()-1)){
            System.out.println("Right Limit Exceeded");
            scroll_layer.setPosition((-size.width)*(sprites.size()-1),0);
        }
        if(difference < -5*GameActivity.VEL_FACTOR){
            direction = -1;
        }
        else if(difference > 5*GameActivity.VEL_FACTOR){
            direction = 1;
        }
        PrevTouchLocation = LocationMoved;

        return true;
    }
    @Override
    public boolean ccTouchesEnded(MotionEvent event)
    {
        endLocation = CCDirector.sharedDirector().convertToGL(CGPoint.make(event.getX(), event.getY()));
        if(!moving)
        {
            float total = startLocation.x-endLocation.x;
            if(direction == 1 && !(counter <=0))
            {

                CGPoint move_pos = CGPoint.make(size.width+total, 0);
                CCMoveBy go_left = CCMoveBy.action(0.5f, move_pos);
                CCCallFuncN regulator = CCCallFuncN.action(this, "regulator");
                CCSequence seq = CCSequence.actions(go_left, regulator);
                moving = true;
                scroll_layer.runAction(seq);


                counter--;
                projectilePriceLabel.setString(getCurrentPrice());


            }
            else if(direction == -1 && !(counter >= sprites.size()-1))
            {

                CGPoint move_pos = CGPoint.make(-size.width+total, 0);
                CCMoveBy go_right = CCMoveBy.action(0.5f, move_pos);
                CCCallFuncN regulator = CCCallFuncN.action(this, "regulator");
                CCSequence seq = CCSequence.actions(go_right, regulator);
                moving = true;
                scroll_layer.runAction(seq);

                counter++;
                projectilePriceLabel.setString(getCurrentPrice());



            }
        }
        PrevTouchLocation = CGPoint.zero();
        return true;
    }

您可以根据自己的要求进行编辑

答案 1 :(得分:2)

检查这个,它用于垂直滚动。你只需改变一点即可实现。

https://stackoverflow.com/a/12056450/1614340

如果你不能从中得到任何想法,请告诉我,我将提供代码。

答案 2 :(得分:1)

您可以将所有精灵添加到父图层,然后使用ccTouchesMoved中的MoveBy修改器移动此父图层

答案 3 :(得分:1)

抱歉抱歉。您必须在使用之前初始化PrevTouchLocation,如下所述。

CGPoint PrevTouchLocation = CGPoint.zero();