拖拽&移动屏幕的位图

时间:2017-04-19 11:03:32

标签: java android bitmap drag-and-drop

我尝试过实施拖拽方法在屏幕上放置一个位图。当卡片是一个imageView和XML文件时,我试过的方法工作了,但我改变了我的方法,我只是在调用draw方法时将位图加载到屏幕上。

有人可以告诉我实现拖放加载到屏幕上的位图的最佳方法吗?提前谢谢。

我的代码: 播放屏幕类:(位图加载并绘制到屏幕上)

     package com.example.llave_000.shootout.screens;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.graphics.Rect;
import android.graphics.RectF;
import android.view.MotionEvent;
import android.view.ScaleGestureDetector;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.view.View.OnTouchListener;


import com.example.llave_000.shootout.Game;
import com.example.llave_000.shootout.MoveGestureDetector;
import com.example.llave_000.shootout.R;
import com.example.llave_000.shootout.Settings.Settings;
import com.example.llave_000.shootout.engine.AssetStore;
import com.example.llave_000.shootout.engine.ElapsedTime;
import com.example.llave_000.shootout.engine.audio.Music;
import com.example.llave_000.shootout.engine.graphics.IGraphics2D;
import com.example.llave_000.shootout.engine.input.Input;
import com.example.llave_000.shootout.engine.input.TouchEvent;

    import com.example.llave_000.shootout.world.GameObject;
    import com.example.llave_000.shootout.world.GameScreen;
    import com.example.llave_000.shootout.world.LayerViewport;
    import com.example.llave_000.shootout.world.ScreenViewport;

    import java.util.List;

    import static com.example.llave_000.shootout.R.id.imageView;

    public class PlayScreen extends GameScreen {


       // /////////////////////////////////////////////////////////////////////////
        // Properties
        // /////////////////////////////////////////////////////////////////////////
        private Rect backButtonBound;
        private Rect hazardCardBound;

        private Music screenClickMusic;


        /**
         * Width and height of the level
         */
       // private final float LEVEL_WIDTH = 1000.0f;
        //private final float LEVEL_HEIGHT = 1000.0f;

        /**
         * Define viewports for this layer and the associated screen projection
         */
        private ScreenViewport mScreenViewport;
        private LayerViewport mLayerViewport;

        private Bitmap backgroundBitmap;
        private Bitmap backButton;
        private Bitmap PlayScreenTitle;
        private Bitmap hazardCard;
        private Rect frontLayerBound;
        private Rect playScreenTitleBound;

        private ImageView cardImage1;
        private ViewGroup rootLayout;
        private int _xDelta;
        private int _yDelta;
        public View view;

        /**
         * User input controls for managing the player and the game
         */
       // protected InputControl pauseButton

        // /////////////////////////////////////////////////////////////////////////
        // Constructors
        // /////////////////////////////////////////////////////////////////////////

        /**
         * Create a game
         *
         * @param game
         *            Game to which this screen belongs */

        public PlayScreen(Game game) {
            super("PlayScreen", game);

            //Define the rects what will be used to 'hold' the images
            int spacingX = game.getScreenWidth() / 8;
            int spacingY = game.getScreenHeight() / 8;
            int padding = spacingY / 10;    //padding between each button
            int line = 1;   //each button is on a new 'line' (under each other)


            // Load in the assets used by the demo
            AssetStore assetManager = game.getAssetManager();
            assetManager.loadAndAddBitmap("pitch", "img/pitch.png");
            assetManager.loadAndAddBitmap("backButton", "img/back_button.png");
            assetManager.loadAndAddBitmap("hazardCard", "img/hazard_card.jpg");


            // Define Rectangles for Bitmaps
           // playScreenTitleBound = new Rect(spacingX * 2, spacingY * 0, spacingX * 6, spacingY * 1);

            this.backgroundBitmap = assetManager.getBitmap("pitch");
            this.backButton = assetManager.getBitmap("backButton");
            this.hazardCard = assetManager.getBitmap("hazardCard");

            //load in sounds
            assetManager.loadAndAddMusic("screenClickMusic", "music/buttonPress.mp3");

            //initialise
            this.screenClickMusic = assetManager.getMusic("screenClickMusic");

        }

        // /////////////////////////////////////////////////////////////////////////
        // Support methods
        // /////////////////////////////////////////////////////////////////////////

        // /////////////////////////////////////////////////////////////////////////
        // Update and Draw methods
        // /////////////////////////////////////////////////////////////////////////

        @Override
        public void update(ElapsedTime elapsedTime) {

            //process any touch events occurring since the update
            Input input = game.getInput();
            List<TouchEvent> touchEvents = input.getTouchEvents();

            if (touchEvents.size() > 0) {

                //Just check the first touch event that occurred in the frame.
                //It means pressing the screen with several fingers may not
                //trigger a 'button'.
                TouchEvent touchEvent = touchEvents.get(0);
                if (backButtonBound.contains((int) touchEvent.x, (int) touchEvent.y)
                        && touchEvent.type == TouchEvent.TOUCH_UP) {
                    // If the play game area has been touched then swap screens
                    game.getScreenManager().removeScreen(this.getName());
                    MenuScreen menuScreen = new MenuScreen(game);
                    if (Settings.soundEnabled) {
                        screenClickMusic.play();
                    }
                    // As it's the only added screen it will become active.
                    game.getScreenManager().addScreen(menuScreen);
                }
                /*else if (hazardCardBound.contains((int) touchEvent.x, (int) touchEvent.y)
                        && touchEvent.type == TouchEvent.TOUCH_DOWN) {
                    RelativeLayout.LayoutParams lparams = (RelativeLayout.LayoutParams) view.getLayoutParams();
                    _xDelta = X - lparams.leftMargin;
                    _yDelta = Y - lparams.topMargin;

                }*/
            }
        }
        @Override
        public void draw(ElapsedTime elapsedTime, IGraphics2D graphics2D) {
        //  load hazard playing card
            /*ImageView hazardCardImageView = (ImageView) view.findViewById(R.id.hazardCardImageView);
            if (hazardCard != null) {
                hazardCardImageView.setImageBitmap(hazardCard);
            }

            cardImage1 = (ImageView) rootLayout.findViewById(R.id.hazardCardImageView);
            RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(500, 150);
            cardImage1.setLayoutParams(layoutParams);
            cardImage1.setOnTouchListener(new ChoiceTouchListener());*/

            // Get and draw the bitmaps into the defined rectangles
            Bitmap backButton = game.getAssetManager().getBitmap("backButton");

            // Create the screen to black and define a clip based on the viewport
            graphics2D.clear(Color.BLACK);
            //graphics2D.clipRect(mScreenViewport.toRect());
            // Define the rects what will be used to 'hold' the images
            int spacingX = game.getScreenWidth() / 8;
            int spacingY = game.getScreenHeight() / 8;
            int padding = spacingY / 10;    //padding between each button
            int line = 1;   //each button is on a new 'line' (under each other)

            hazardCardBound = new Rect(spacingX, spacingY * 2 + padding, spacingX * 7, spacingY * 3);

            if (frontLayerBound == null) {
                frontLayerBound = new Rect(0, 0, graphics2D.getSurfaceWidth(),
                        graphics2D.getSurfaceHeight());
            }

            if (backButtonBound == null) {
                int left = 10;
                int bottom = (graphics2D.getSurfaceHeight() - 120);

                backButtonBound = new Rect(left, bottom, left + 100, bottom + 120);
            }

            //cardImage1 = (ImageView)view.findViewById(R.id.hazardCardImageView);
     /*       RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(500, 150);
            cardImage1.setLayoutParams(layoutParams);
            cardImage1.setOnTouchListener(new ChoiceTouchListener());
            cardImage1.setOnTouchListener(new ChoiceTouchListener());
            cardImage1.setImageBitmap(hazardCard);*/

      //       RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(500, 150);

            //draw bitmaps with relative bounds
            graphics2D.drawBitmap(backgroundBitmap, null, frontLayerBound,null);
            graphics2D.drawBitmap(backButton, null, backButtonBound, null);
            graphics2D.drawBitmap(hazardCard,null, hazardCardBound, null);



           // RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(500, 150);
    //        cardImage1.setLayoutParams(layoutParams);
    //        cardImage1.setImageBitmap(hazardCard);
            //cardImage1.setOnTouchListener(new ChoiceTouchListener());

        }


      /*  @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {

            // Inflate the layout for this fragment
            View view = inflater.inflate(R.layout.fragment_play_screen, container, false);

            FragmentManager fm = getFragmentManager();
            Fragment fragment = fm.findFragmentById(R.id.fragment_play_screen);

            if (fragment == null) {
    //            Log.d("","@ PLAY SCREEN"); --logcat shows execution reaches this point
                fragment = createFragment();
                fm.beginTransaction().add(R.id.fragment_play_screen, fragment)
                        .commit();
            }

            AssetManager assetManager = getActivity().getAssets();

            Bitmap backButton = loadBitmap(assetManager, "img/back_button.png");

            ImageView backButtonimageView = (ImageView) view.findViewById(R.id.backButton);
            if (backButton != null) {
                backButtonimageView.setImageBitmap(backButton);
            }
            backButtonimageView.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    Log.d("BACK BUTTON CLICKED", "BACK BUTTON CLICKED");

                    FragmentTransaction transaction = getFragmentManager().beginTransaction();

                    //go back to main menu screen
                    transaction.replace(R.id.fragment_play_screen, new MenuScreen());
                    transaction.addToBackStack(null);

                    // Commit the transaction
                    transaction.commit();
                }
            });



        private Layer target;

    }

    class Layer {
        Matrix matrix = new Matrix();
        Matrix inverse = new Matrix();
        RectF bounds;
        View parent;
        Bitmap bitmap;
        MoveGestureDetector mgd;

        public Layer(Context ctx, View p, Bitmap b) {
            parent = p;
            bitmap = b;
            bounds = new RectF(0, 0, b.getWidth(), b.getHeight());
            mgd = new MoveGestureDetector(ctx, mgl);
            matrix.postTranslate(50 + (float) Math.random() * 50, 50 + (float) Math.random() * 50);
        }

        public boolean contains(MotionEvent event) {
            matrix.invert(inverse);
            float[] pts = {event.getX(), event.getY()};
            inverse.mapPoints(pts);
            if (!bounds.contains(pts[0], pts[1])) {
                return false;
            }
            return Color.alpha(bitmap.getPixel((int) pts[0], (int) pts[1])) != 0;
        }

        public boolean onTouchEvent(MotionEvent event) {
            mgd.onTouchEvent(event);
            return true;
        }

        public void draw(Canvas canvas) {
            canvas.drawBitmap(bitmap, matrix, null);
        }

        MoveGestureDetector.SimpleOnMoveGestureListener mgl = new MoveGestureDetector.SimpleOnMoveGestureListener() {
            @Override
            public boolean onMove(MoveGestureDetector detector) {
                PointF delta = detector.getFocusDelta();
                matrix.postTranslate(delta.x, delta.y);
                parent.invalidate();
                return true;
            }
        };




    }

IGraphics2D课程:

/**
 * The graphics 2D interface defines the set of graphical operations that can be
 * applied to a render surface.
 * 
 * @version 1.0
 */
public interface IGraphics2D {

    /**
     * Get the width of the render surface
     * 
     * @return Width of the render surface
     */
    public int getSurfaceWidth();

    /**
     * Get the height of the render surface
     * 
     * @return Height of the render surface
     */
    public int getSurfaceHeight();

    /**
     * Insert the specified rectangular clip region
     * 
     * @param clipRegion
     */
    public void clipRect(Rect clipRegion);

    /**
     * Set the surface colour to that specified colour (assumed to be in the
     * same format as the Color class - ARGB).
     * 
     * @param colour
     *            ARGB formatted colour
     */
    public void clear(int colour);

    /**
     * Draw the specified text string
     * 
     * @param text
     *            String of text to be rendered
     * @param x
     *            Location of text on x-axis
     * @param y
     *            Location of text on y-axis
     * @param paint
     *            Paint parameters controlling text render format
     */
    public void drawText(String text, float x, float y, Paint paint);

    /**
     * Draw the specified bitmap
     * 
     * @param bitmap
     *            Bitmap to be rendered
     * @param srcRect
     *            Source region to be rendered (if null full source is rendered)
     * @param desRect
     *            Destination region for the render
     * @param paint
     *            Paint parameters controlling how the bitmap is rendered
     */
    public void drawBitmap(Bitmap bitmap, Rect srcRect, Rect desRect,
                           Paint paint);

    /**
     * Draw the specified bitmap
     * 
     * @param bitmap
     *            Bitmap to be rendered
     * @param matrix
     *            Matrix defining bitmap scaling, rotation, translation, etc.
     * @param paint
     *            Paint parameters controlling how the bitmap is rendered
     */
    public void drawBitmap(Bitmap bitmap, Matrix matrix, Paint paint);
}

编辑: 有效的方法是使用这个:

RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(500, 150);
        cardImage.setLayoutParams(layoutParams);
        cardImage.setOnTouchListener(new ChoiceTouchListener());



 //load hazard playing card
    Bitmap hazardCard = loadBitmap(assetManager, "img/hazard_card.jpg");
    ImageView hazardCardimageView = (ImageView) view.findViewById(R.id.hazardCardImageView);
    if (hazardCard != null) {
        hazardCardimageView.setImageBitmap(hazardCard);
    }
     private final class ChoiceTouchListener implements View.OnTouchListener {
            public boolean onTouch(View view, MotionEvent event) {
                final int X = (int) event.getRawX();
                final int Y = (int) event.getRawY();
                switch (event.getAction() & MotionEvent.ACTION_MASK) {
                    case MotionEvent.ACTION_DOWN:
                        RelativeLayout.LayoutParams lparams = (RelativeLayout.LayoutParams) view.getLayoutParams();
                        _xDelta = X - lparams.leftMargin;
                        _yDelta = Y - lparams.topMargin;
                        break;
                    case MotionEvent.ACTION_UP:
                        break;
                    case MotionEvent.ACTION_POINTER_DOWN:
                        break;
                    case MotionEvent.ACTION_POINTER_UP:
                        break;
                    case MotionEvent.ACTION_MOVE:
                        RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) view.getLayoutParams();
                        layoutParams.leftMargin = X - _xDelta;
                        layoutParams.topMargin = Y - _yDelta;
                        layoutParams.rightMargin = 0b11111111111111111111111100000110;
                        layoutParams.bottomMargin = 0b11111111111111111111111100000110;
                        view.setLayoutParams(layoutParams);
                        break;
                }
                rootLayout.invalidate();
                return true;
            }
        }

主要活动类: package com.example.llave_000.shootout;

import android.app.Activity;
import android.app.FragmentManager;
import android.graphics.PointF;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.ScaleGestureDetector;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;

import com.example.llave_000.shootout.world.DemoGame;
import com.example.llave_000.shootout.BaseGestureDetector;
import com.example.llave_000.shootout.MoveGestureDetector;
import android.widget.ImageView;

public class MainActivity extends Activity implements View.OnTouchListener {

    private float mScaleFactor = 1.0f;
    private float mRotationDegrees = 0.f;
    private float mFocusX = 0.f;
    private float mFocusY = 0.f;

    private ImageView cardImage1;
    private ViewGroup rootLayout;
    public View view;

    private MoveGestureDetector mMoveDetector;


    private ScaleGestureDetector mScaleDetector;
/*    private RotationGestureDetector mRotateDetector;
    private MoveGestureDetector mMoveDetector;*/

    /**
     * Game fragment instance
     */
    private Game mGame;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        //ImageView hazardCardImageView = (ImageView) view.findViewById(R.id.hazardCardImageView);

        cardImage1 = (ImageView)findViewById(R.id.hazardCardImageView);

        // Setup Gesture Detectors
        mMoveDetector = new MoveGestureDetector(getApplicationContext(), new MoveListener());
        //mScaleDetector = new ScaleGestureDetector(getApplicationContext(), new ScaleListener());
        /*mRotateDetector = new RotationGestureDetector(getApplicationContext(), new RotateListener());
        mMoveDetector = new MoveGestureDetector(getApplicationContext(), new MoveListener());*/


        // Setup the window as suitable for a game, namely: full screen
        // with no title and a request to keep the screen on. The changes
        // are made before any content is inflated.
        Window window = getWindow();
        window.requestFeature(Window.FEATURE_NO_TITLE);
        window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
        window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

        // Set the content view to use a simple frame layout
        setContentView(R.layout.activity_main);

        // Add in the main game fragment..
        FragmentManager fm = getFragmentManager();
       // MenuScreen menuScreen = (MenuScreen)fm.findFragmentById(R.id.activity_main_id);
        mGame = (Game)fm.findFragmentById(R.id.activity_main_id);

        if (mGame == null) {
            mGame = new DemoGame(); //not sure if correct
            fm.beginTransaction().add(R.id.activity_main_id, mGame)
                    .commit();
        }

        // Add in the main game fragment
     /*   if (savedInstanceState == null) {
            getFragmentManager().beginTransaction()
                    .add(R.id.activity_main_id, new MenuScreen()).commit();
        }*/

    }

    public boolean onTouch(View view, MotionEvent event) {
        mScaleDetector.onTouchEvent(event);
        mMoveDetector.onTouchEvent(event);

       /* mRotateDetector.onTouchEvent(event);
        mMoveDetector.onTouchEvent(event);
*/
        // Mmmmmhhhagic!!!
        //  with: mScaleFactor, mRotationDegrees, mFocusX and mFocusY

        return true; // indicate event was handled
    }
    private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
        @Override
        public boolean onScale(ScaleGestureDetector detector) {
            mScaleFactor *= detector.getScaleFactor(); // scale change since previous event
            return true;
        }
    }

 /*   private class RotateListener extends RotateGestureDetector.SimpleOnRotateGestureListener {
        @Override
        public boolean onRotate(RotateGestureDetector detector) {
            mRotationDegrees -= detector.getRotationDegreesDelta();
            return true;
        }
    }
*/
    private class MoveListener extends MoveGestureDetector.SimpleOnMoveGestureListener {
        @Override
        public boolean onMove(MoveGestureDetector detector) {
            PointF d = detector.getFocusDelta();
            mFocusX += d.x;
            mFocusY += d.y;

            return true;
        }
    }



    @Override
    public void onBackPressed() {
        // If the fragment does not consume the back event then
        // trigger the default behaviour
        if(!mGame.onBackPressed())
            super.onBackPressed();
    }

   /* public boolean onTouchEvent(MotionEvent me) {
        if (me.getAction() == MotionEvent.ACTION_DOWN) {
            //code in here to take me to new screen with match attax background
            //with new screen displaying a card. then work on being able to move that card.

            //playButtonY -= 20;

        }*/
       // playButton.setY(playButtonY);
        //code in here to take me to new screen with match attax background
        //with new screen displaying a card. then work on being able to move that card.

        //return true;
    }

...

0 个答案:

没有答案