This is my xml file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/LinearLayout0"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".CanvasActivity"
android:baselineAligned="false">
<LinearLayout
android:id="@+id/LinearLayout1"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="#f9dfcb">
</LinearLayout>
<LinearLayout
android:id="@+id/LinearLayout2"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="3"
android:background="#000000"
>
</LinearLayout>
</LinearLayout>
My activity code
import android.app.Activity;
import android.content.Intent;
import android.graphics.Canvas;
import android.graphics.Color;
import android.os.Bundle;
import android.view.GestureDetector;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.LinearLayout;
import android.widget.Toast;
public class CanvasActivity extends Activity {
private GestureDetector gestureDetector;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_canvas);
gestureDetector = new GestureDetector(this, new GestureListener());
LinearLayout LinearLayout1=(LinearLayout)findViewById(R.id.LinearLayout1);
LinearLayout1.setOnTouchListener(new OnTouchListener(){
public boolean onTouch(View v, MotionEvent event){
if (gestureDetector.onTouchEvent(event))
{
return true;
}
return false;
}
});
/*********EDITED*******/
LinearLayout LinearLayout2=(LinearLayout)findViewById(R.id.LinearLayout2);
int width=LinearLayout2.getWidth();
int height=LinearLayout2.getHeight();
LinearLayout2.addView(new Canvasview(this), width, height) ;
LinearLayout2.setOnTouchListener(new OnTouchListener(){
public boolean onTouch(View v, MotionEvent event){
Canvasview cv= new Canvasview(v.getContext());
cv.onTouchEvent(event);
return true;
}
});
}
//discerning swipes
class GestureListener extends SimpleOnGestureListener
{
private static final int SWIPE_MIN_DISTANCE = 120;
private static final int SWIPE_THRESHOLD_VELOCITY = 200;
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2,
float velocityX, float velocityY)
{
if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE &&
Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
//From Right to Left
Toast.makeText(CanvasActivity.this, "Left Swipe", Toast.LENGTH_SHORT).show();
return true;
}
else if(e1.getY() - e2.getY() > SWIPE_MIN_DISTANCE &&
Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY) {
//From Bottom to Top
Toast.makeText(CanvasActivity.this, "Top Swipe", Toast.LENGTH_SHORT).show();
return true;
}
return false;
}
@Override
public boolean onDown(MotionEvent e)
{
return true;
}
}
}
My Canvasview looks like this
public class Canvasview extends SurfaceView implements SurfaceHolder.Callback{
private int width, height;
private Paint textPaint = new Paint();
private Paint touchPaint = new Paint();
private int colors[] = new int[10];
public Canvasview(Context context) {
super(context);
SurfaceHolder holder = getHolder();
holder.addCallback(this);
setFocusable(true); // make sure we get key events
setFocusableInTouchMode(true); // make sure we get touch events
init();
}
private void init()
{
textPaint.setColor(Color.WHITE);
colors[0] = Color.RED;
touchPaint = new Paint();
touchPaint.setColor(colors[0]);
}
public boolean onTouchEvent(MotionEvent event)
{
Canvas c = getHolder().lockCanvas();
if (c != null)
{
if (event.getAction() == MotionEvent.ACTION_UP)
{
// clear everything
}
else
{
int xval = (int)event.getX();
int yval = (int)event.getY();
drawCircle(xval,yval,touchPaint,c);
}
getHolder().unlockCanvasAndPost(c);
}
return true;
}
public void clear(Canvas c){
c = getHolder().lockCanvas();
c.drawColor(Color.BLACK);
getHolder().unlockCanvasAndPost(c);
}
private void drawCircle(int x, int y, Paint paint, Canvas c)
{
c.drawCircle(x, y, 2, paint);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height){
Canvas c = getHolder().lockCanvas();
if (c != null)
{
// clear screen
c.drawColor(Color.BLACK);
getHolder().unlockCanvasAndPost(c);
}
}
@Override
public void surfaceCreated(SurfaceHolder arg0) {
// TODO Auto-generated method stub
}
@Override
public void surfaceDestroyed(SurfaceHolder arg0) {
// TODO Auto-generated method stub
}
}
I need the canvas only in linearlayout2, but the canvas occupies the entire screen. I am not sure where I am going wrong.
EDIT: Well I did few changes and I get the Canvasview in linearlayout2, the ontouchevents of Canvasview detects the touch events but in Canvasview public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) method does not initialize a canvas and therefore it is always null. To draw I need the canvas not to be null. Any help is appreciated
LiniarLayout
aandroid:weightSum="4"
. But I would suggest you to find out another way to do that... weight parameter is not commanded, because the layout is calculated twice. – Serj Lotutovici