1/* 2 * Copyright (C) 2016 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package com.google.android.car.kitchensink.touch; 18 19import android.content.Context; 20import android.graphics.Canvas; 21import android.graphics.Color; 22import android.graphics.Paint; 23import android.graphics.Point; 24import android.util.AttributeSet; 25import android.util.Log; 26import android.view.MotionEvent; 27import android.view.View; 28 29import java.util.ArrayList; 30import java.util.List; 31 32public class TouchPointView extends View { 33 @SuppressWarnings("unused") 34 private static final String TAG = TouchPointView.class.getSimpleName(); 35 36 private static final boolean LOG_ONLY = true; 37 38 private final int[] mColors = { 39 Color.RED, 40 Color.GREEN, 41 Color.BLUE, 42 Color.YELLOW, 43 Color.MAGENTA, 44 Color.BLACK, 45 Color.DKGRAY 46 }; 47 List<Finger> mFingers; 48 Paint mPaint; 49 50 public TouchPointView(Context context, AttributeSet attrs) { 51 this(context, attrs, 0); 52 } 53 54 public TouchPointView(Context context, AttributeSet attrs, int defStyle) { 55 super(context, attrs, defStyle); 56 mFingers = new ArrayList<Finger>(); 57 58 mPaint = new Paint(); 59 mPaint.setStyle(Paint.Style.FILL); 60 } 61 62 @Override 63 public boolean onTouchEvent(MotionEvent event) { 64 if (LOG_ONLY) { 65 logTouchEvents(event); 66 return true; 67 } 68 mFingers.clear(); 69 if (event.getActionMasked() == MotionEvent.ACTION_UP) { 70 invalidate(); 71 return true; 72 } 73 for (int i = 0; i < event.getPointerCount(); i++) { 74 int pointerId = event.getPointerId(i); 75 int pointerIndex = event.findPointerIndex(pointerId); 76 Finger finger = new Finger(); 77 finger.point = new Point((int)event.getX(pointerIndex), (int)event.getY(pointerIndex)); 78 finger.pointerId = pointerId; 79 80 mFingers.add(finger); 81 } 82 invalidate(); 83 return true; 84 } 85 86 private void logTouchEvents(MotionEvent event) { 87 if (event.getActionMasked() != MotionEvent.ACTION_UP) { 88 return; 89 } 90 91 for (int i = 0; i < event.getPointerCount(); i++) { 92 int pointerId = event.getPointerId(i); 93 int pointerIndex = event.findPointerIndex(pointerId); 94 long downTime = event.getDownTime(); 95 long eventTime = event.getEventTime(); 96 Log.d(TAG, "TouchUp [x=" + event.getX(pointerIndex) + ", y=" + event.getY(pointerIndex) + 97 " , pointerId=" + pointerId + ", pointerIndex=" + pointerIndex + ", duration=" + 98 (eventTime - downTime) + "]"); 99 } 100 } 101 102 @Override 103 public void onDraw(Canvas canvas) { 104 if (LOG_ONLY) { 105 return; 106 } 107 int radius = canvas.getWidth() / 20; 108 for (int i = 0; i < mFingers.size(); i++) { 109 Finger finger = mFingers.get(i); 110 Point point = finger.point; 111 int color = mColors[finger.pointerId % mColors.length]; 112 mPaint.setColor(color); 113 canvas.drawCircle(point.x, point.y, radius, mPaint); 114 } 115 } 116 117 private class Finger { 118 public Point point; 119 public int pointerId; 120 } 121} 122