Android custom touch view, with callback interface.

This example, implement custom view with touch function, and also callback interface. And also implement listener at activity side. Such that the view can pass touched information to activity.


com.example.androidtouchview.TouchView.java, custom view.
package com.example.androidtouchview;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

public class TouchView extends View {

private Paint paint, touchPaint;
private boolean touched;
private float touchX, touchY;
private float touchMajor, touchMinor;

public TouchView(Context context) {
super(context);
init(null, 0);
}

public TouchView(Context context, AttributeSet attrs) {
super(context, attrs);
init(attrs, 0);
}

public TouchView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(attrs, defStyleAttr);
}

private void init(AttributeSet attrs, int defStyle) {
paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(Color.BLUE);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(1);

touchPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
touchPaint.setColor(Color.RED);
touchPaint.setStyle(Paint.Style.FILL_AND_STROKE);
touchPaint.setStrokeWidth(1);

touched = false;
}

@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);

int paddingLeft = getPaddingLeft();
int paddingTop = getPaddingTop();
int paddingRight = getPaddingRight();
int paddingBottom = getPaddingBottom();

canvas.drawRect(
0,
0,
getWidth(),
getHeight(),
paint);
canvas.drawRect(
paddingLeft,
paddingTop,
getWidth()- paddingRight,
getHeight()- paddingBottom,
paint);

if(touched){
canvas.drawCircle(touchX, touchY, touchMinor, touchPaint);
canvas.drawCircle(touchX, touchY, touchMajor, paint);
}
}

@Override
public boolean onTouchEvent(MotionEvent event) {
switch(event.getAction()){
case MotionEvent.ACTION_MOVE:
case MotionEvent.ACTION_DOWN:
touchX = event.getX();
touchY = event.getY();
touchMajor = event.getTouchMajor();
touchMinor = event.getTouchMinor();
touched = true;
break;
default:
touched = false;
}

onViewTouchedListener.OnViewTouched(touchX, touchY, touched);

invalidate();
return true;
}

/*
Set up callback function
*/
private OnViewTouchedListener onViewTouchedListener;
public interface OnViewTouchedListener {
public void OnViewTouched(float x, float y, boolean touched);
}

public void setOnViewTouchedListener(OnViewTouchedListener listener) {
onViewTouchedListener = listener;
}
}


layout/activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MainActivity"
android:orientation="vertical">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:autoLink="web"
android:text="http://android-er.blogspot.com/"
android:textStyle="bold" />

<TextView
android:id="@+id/touchedInfo"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"/>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#E0E0E0">
<com.example.androidtouchview.TouchView
android:id="@+id/myTouchView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="50dp"
android:paddingRight="50dp"
android:paddingTop="50dp"
android:paddingBottom="50dp" />
</LinearLayout>


</LinearLayout>

com.example.androidtouchview.MainActivity
package com.example.androidtouchview;

import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.widget.TextView;

public class MainActivity extends ActionBarActivity {

TextView touchedInfo;
TouchView touchView;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
touchedInfo = (TextView)findViewById(R.id.touchedInfo);
touchView = (TouchView)findViewById(R.id.myTouchView);
touchView.setOnViewTouchedListener(new TouchView.OnViewTouchedListener() {
@Override
public void OnViewTouched(float x, float y, boolean touched) {
touchedInfo.setText(
"Touched: " + touched + "\n" +
"x: " + x + "\n" + "y: " + y);
}
});

}

}



download filesDownload the files (Android Studio Format).