@Hrvoje, I'd go learn Scala and not bother with Java. You can just as easily develop android apps with Scala as you can with Java, although developing android apps with Scala instead of Java might actually be far easier. I'll show you an example. Below is an activity in Android in Java to show off accessibility features (from https://github.com/googlesamples/androi … y/#readme) (comments excluded for brevity):
package com.example.android.basicaccessibility;
import android.annotation.TargetApi;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Build;
import android.util.AttributeSet;
import android.view.View;
import android.view.accessibility.AccessibilityEvent;
public class DialView extends View {
private static int SELECTION_COUNT = 4;
private static float FONT_SIZE = 40f;
private float mWidth;
private float mHeight;
private float mWidthPadded;
private float mHeightPadded;
private Paint mTextPaint;
private Paint mDialPaint;
private float mRadius;
private int mActiveSelection;
public DialView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
private void init() {
mTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mTextPaint.setColor(Color.BLACK);
mTextPaint.setStyle(Paint.Style.FILL_AND_STROKE);
mTextPaint.setTextAlign(Paint.Align.CENTER);
mTextPaint.setTextSize(FONT_SIZE);
mDialPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mDialPaint.setColor(Color.GRAY);
mActiveSelection = 0;
setOnClickListener(()->{
mActiveSelection = (mActiveSelection + 1) % SELECTION_COUNT;
sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED);
invalidate();
});
}
@Override
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
public void onPopulateAccessibilityEvent(AccessibilityEvent event) {
super.onPopulateAccessibilityEvent(event);
int eventType = event.getEventType();
if (eventType == AccessibilityEvent.TYPE_VIEW_SELECTED ||
eventType == AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED) {
event.getText().add("Mode selected: " + Integer.toString(mActiveSelection + 1) + ".");
event.setItemCount(SELECTION_COUNT);
event.setCurrentItemIndex(mActiveSelection);
}
if (eventType == AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED) {
event.getText().add("Tap to change.");
}
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
float xPadding = (float) (getPaddingLeft() + getPaddingRight());
float yPadding = (float) (getPaddingTop() + getPaddingBottom());
mWidth = w;
mHeight = h;
mWidthPadded = w - xPadding;
mHeightPadded = h - yPadding;
mRadius = (float) (Math.min(mWidth, mHeight) / 2 * 0.8);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawCircle(mWidth / 2, mHeight / 2, (float) mRadius, mDialPaint);
final float labelRadius = mRadius + 10;
for (int i = 0; i < SELECTION_COUNT; i++) {
float[] xyData = computeXYForPosition(i, labelRadius);
float x = xyData[0];
float y = xyData[1];
canvas.drawText(Integer.toString(i + 1), x, y, mTextPaint);
}
final float markerRadius = mRadius - 35;
float[] xyData = computeXYForPosition(mActiveSelection, markerRadius);
float x = xyData[0];
float y = xyData[1];
canvas.drawCircle(x, y, 20, mTextPaint);
}
private float[] computeXYForPosition(final int pos, final float radius) {
float[] result = new float[2];
Double startAngle = Math.PI * (9 / 8d); // Angles are in radiansq
Double angle = startAngle + (pos * (Math.PI / 4));
result[0] = (float) (radius * Math.cos(angle)) + (mWidth / 2);
result[1] = (float) (radius * Math.sin(angle)) + (mHeight / 2);
return result;
}
}
And here it is in Scala:
package com.example.android.basicaccessibility
import android.annotation.TargetApi
import android.content.Context
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.os.Build
import android.util.AttributeSet
import android.view.View
import android.view.accessibility.AccessibilityEvent
import DialView._
object DialView {
private var SELECTION_COUNT: Int = 4
private var FONT_SIZE: Float = 40f
}
class DialView(context: Context, attrs: AttributeSet) extends View(context, attrs) {
private var mWidth: Float = _
private var mHeight: Float = _
private var mWidthPadded: Float = _
private var mHeightPadded: Float = _
private var mTextPaint: Paint = _
private var mDialPaint: Paint = _
private var mRadius: Float = _
private var mActiveSelection: Int = _
init()
private def init(): Unit = {
mTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG)
mTextPaint.setColor(Color.BLACK)
mTextPaint.setStyle(Paint.Style.FILL_AND_STROKE)
mTextPaint.setTextAlign(Paint.Align.CENTER)
mTextPaint.setTextSize(FONT_SIZE)
mDialPaint = new Paint(Paint.ANTI_ALIAS_FLAG)
mDialPaint.setColor(Color.GRAY)
mActiveSelection = 0
this.onClickListener = () => {
mActiveSelection = (mActiveSelection + 1) % SELECTION_COUNT
sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED)
invalidate()
}
}
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
override def onPopulateAccessibilityEvent(event: AccessibilityEvent): Unit = {
super.onPopulateAccessibilityEvent(event)
val eventType: Int = event.getEventType
if (eventType == AccessibilityEvent.TYPE_VIEW_SELECTED ||
eventType == AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED) {
event.getText.add("Mode selected: " + java.lang.Integer.toString(mActiveSelection + 1) +".")
event.setItemCount(SELECTION_COUNT)
event.setCurrentItemIndex(mActiveSelection)
}
if (eventType == AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED) {
event.getText.add("Tap to change.")
}
}
protected override def onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int): Unit = {
val xPadding: Float = (getPaddingLeft + getPaddingRight).toFloat
val yPadding: Float = (getPaddingTop + getPaddingBottom).toFloat
mWidth = w
mHeight = h
mWidthPadded = w - xPadding
mHeightPadded = h - yPadding
mRadius = (Math.min(mWidth, mHeight) / 2 * 0.8).toFloat
}
protected override def onDraw(canvas: Canvas): Unit = {
super.onDraw(canvas)
canvas.drawCircle(mWidth / 2, mHeight / 2, mRadius.toFloat, mDialPaint)
val labelRadius: Float = mRadius + 10
for (i <- 0 until SELECTION_COUNT) {
val xyData: Array[Float] = computeXYForPosition(i, labelRadius)
val x: Float = xyData(0)
val y: Float = xyData(1)
canvas.drawText(java.lang.Integer.toString(i + 1), x, y, mTextPaint)
}
val markerRadius: Float = mRadius - 35
val xyData: Array[Float] = computeXYForPosition(mActiveSelection, markerRadius)
val x: Float = xyData(0)
val y: Float = xyData(1)
canvas.drawCircle(x, y, 20, mTextPaint)
}
private def computeXYForPosition(pos: Int, radius: Float): Array[Float] = {
val result: Array[Float] = Array.ofDim[Float](2) // Angles are in radiansq
val startAngle: java.lang.Double = Math.PI * (9 / 8d)
val angle: java.lang.Double = startAngle + (pos * (Math.PI / 4))
result(0) = (radius * Math.cos(angle)).toFloat + (mWidth / 2)
result(1) = (radius * Math.sin(angle)).toFloat + (mHeight / 2)
result
}
}
"On two occasions I have been asked [by members of Parliament!]: 'Pray, Mr. Babbage, if you put into the machine wrong figures, will the right answers come out ?' I am not able rightly to apprehend the kind of confusion of ideas that could provoke such a question." — Charles Babbage.
My Github