4

I am making an Android game which uses the View class and I am not using an XML-layout.

All my images are drawn with canvas. Now my problem is the I cannot use a bitmap.

I am trying to add an ImageView dynamically to my View class, to use the touchable event.

Why dynamically? Because I could not use XML-layout.
Here is my code:

package com.example.poolmaster;

import java.util.ArrayList;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.Gravity;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;
import android.widget.LinearLayout;

public class MainActivity extends Activity {
    private int cuePosx, cuePosy;

    int cueHeight, cueWeight;
    double rotatingAngle;
    int height;
    int wwidth;
    int cueHeight2, cueWeight2;
    Bitmap table, stick, raise;

    ImageView button = new ImageView(this);

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        rotatingAngle = 0;
        DisplayMetrics displaymetrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
        height = displaymetrics.heightPixels;
        wwidth = displaymetrics.widthPixels;
        cueHeight2 = height / 2;
        cueWeight2 = wwidth / 2;
        System.out.println("**************************************");
        System.out.println("height " + height);
        System.out.println("weight" + wwidth);
        System.out.println("**************************************");
      
        // Set generic layout parameters
        GamePlay custom = new GamePlay(this);

        setContentView(custom);
       // setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        if (ev.getAction() == MotionEvent.ACTION_MOVE){
            // cuePosy += 10;
            // System.out.println("xCORDİNATES!!!! " +ev.getX());
            // System.out.println("yCORDİNATES!!!! " +ev.getY());
            rotatingAngle=getAngle(ev.getX(), ev.getY());
            System.out.println("Angle " +rotatingAngle);
        }
        if (ev.getAction()==MotionEvent.ACTION_DOWN){
            System.out.println("****************** ACTİON DOWN ****************");
            // cueHeight2 += 10;
            // cueWeight2 += 20;
            // cuePosy = 320;
        }
        if (ev.getAction()==MotionEvent.ACTION_UP){
            System.out.println("****************** ACTİON DOWN ****************");
            // cueHeight2 -= 10;
            // cueWeight2 -= 20;
            // cuePosy = 320;
        }
        return true;
    }
    private double getAngle(double xTouch, double yTouch) {
        double theta;
        
        theta = Math.toDegrees(Math.atan2(height / 2 - yTouch, xTouch - wwidth / 2));
        return theta;
    }
    
    public class GamePlay extends View {
        public GamePlay(Context context) {
            super(context);
            // TODO Auto-generated constructor stub
            table = BitmapFactory.decodeResource(getResources(), R.drawable.bg);
            table = Bitmap.createScaledBitmap(table, wwidth, height, true);
            stick = BitmapFactory.decodeResource(getResources(), R.drawable.stick);

            raise = BitmapFactory.decodeResource(getResources(), R.drawable.raise);
            cueHeight = stick.getHeight();
            System.out.println("ıstaka " + cueHeight);
            cueWeight = stick.getWidth();
            cuePosx = wwidth / 2;
            cuePosy = height - cueHeight - 180;
        }
        @SuppressLint({ "DrawAllocation", "DrawAllocation" })
        @Override
        public void onDraw(Canvas canvas) {
            super.onDraw(canvas);

            Matrix matrix = new Matrix();
            matrix.setTranslate(cueWeight2, cueHeight2);
            matrix.postRotate((float)rotatingAngle, cueWeight2, cueHeight2); // anti-clockwise by 90 degrees
               
            // create a new bitmap from the original using the matrix to transform the result
            Bitmap rotatedBitmap = Bitmap.createBitmap(stick, 0, 0, stick.getWidth(), stick.getHeight(), matrix, false);
               
            canvas.save(); // Save the position of the canvas.
            canvas.restore();
               
            // Rotate the canvas.
            canvas.drawBitmap(table, 0, 0, null); // Draw the ball on the rotated canvas.
            canvas.drawBitmap(stick, matrix, null);
            canvas.drawBitmap(raise, 0, 0, null);
            invalidate();
        }
    }
}
1
  • If my answer is helping you then please accept it, so it will help others also. Commented Dec 28, 2012 at 4:51

2 Answers 2

4

This is for adding imageview to a layout where Activity class is extended

   LinearLayout lL = findViewById(R.id.xmlfile_layout_id);

   ImageView imgView = new ImageView(context); 

   imgView.setVisibility(View.VISIBLE);
   lL.addView(imgView);

This is for adding imageview to a canvas where View class is extended

Initially, you cannot place any imageview, edit text or buttons using canvas. Instead, you have to draw it. So create a custom layout and draw that layout with canvas

Try this, It might help you. in onDraw(..)

   LinearLayout lL = new LinearLayout(context);

   ImageView imgView = new ImageView(context); 

   imgView.setVisibility(View.VISIBLE);
   lL.addView(imgView);

    lL.measure(canvas.getWidth(), canvas.getHeight());
    lL.layout(0, 0, canvas.getWidth(), canvas.getHeight());

    // placing the edit text at specific co-ordinates:
    //canvas.translate(0, 0);
    layout.draw(canvas);

And take a look at this another example : Click here

It gives another way of adding views

Sign up to request clarification or add additional context in comments.

8 Comments

yeah you can add this image to any view .
what is layout object here(layout.draw)? you mean lL object?
unfortunately it gave exception
ok now there is no exception but there is no image on the screen
Now remove this line : lL.draw(canvas); I'm not sure, try it
|
0

Use below code for that.

For Create ImageView Dynamically

ImageView mImgView1 = new ImageView(this);

For Add into your View write below code before setContentView(custom); (If GamePlay is your View Class)

custom.add(mImgView1);

2 Comments

yes gameplay is my View class(public void GamePlay extends View) write like this.however there is no method like custom.add
@TunçDoğan Then please googling about that because i don't know about how to add add() method in custom view class.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.