'Add ImageView dynamically to View
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();
}
}
}
Solution 1:[1]
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
Solution 2:[2]
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);
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | |
| Solution 2 | Dipak Keshariya |
