МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
Кафедра ЕОМ
/
ЗВІТ ДО ЛАБОРАТОРНОЇ РОБОТИ №3
з дисципліни:
«Мережні операційні системи»
на тему:
«Управління вводом/виводом та сенсорною підсистемою в ОС Android»
МЕТА РОБОТИ: Оволодіти навичками програмування і управління вводом/виводом й сенсорною підсистемою в ОС Android.
1. Завдання
Створити тестову програму на основі програми-прототипу згідно заданого варіанту.
Програма контролю дотиків до сенсорного екрану (SingleTouchTest.java та MultiTouchTest.java)
Інтерфейс простої форми для вводу даних.
2. Перелік основних елементів інтерфейсу Android-пристрою
Графічний інтерфейс користувача для Android програми побудований з використанням ієрархії View і ViewGroup об'єктів. View об'єкти, як правило - це UI віджети, такі як кнопки або текстові поля і ViewGroup, а також невидимі контейнери, які визначають, як будуть використовуватись child-елементи, наприклад, у сітці або вертикальному списку.
Android надає XML-словник, який відповідає підкласам View і ViewGroup, тому ви можете визначити свій користувальницький інтерфейс в XML, використовуючи ієрархію елементів інтерфейсу користувача.
/
Рис.1. Ілюстрація того, як ViewGroup об'єкти утворюють філії в макеті і містять інші View об'єкти.
Основними елементами інтерфейсу Android пристрою є: кнопки, списки, текстові поля вводу, текстові поля виводу, radio button, check button, progress bar, data picker, rating bar та інші.
Платформа для інтерфейсу користувача Android заснована на обробці дотиків. Пристрої Android оснащуються сенсорними екранами, тому android додатки повинні добре підтримувати сенсорний ввід. У режимі сенсорного введення зазвичай немає фокусу і вибраного елемента, а при перемиканні на інші режими (наприклад: режим списку) і назад фокус і вибраний елемент можуть зникати і знову з'являтися. Винятком є сфокусований режим сенсорного введення. Кнопки і віджети повинні бути досить великими, щоб їх можна було вибрати дотиками.
3. Лістинг тестової програми
//MainActivity.java
package com.example.pikaso_lab3;
import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.widget.EditText;
import android.widget.RadioGroup;
public class MainActivity extends Activity {
Lenengrad YuliaKogut = new Lenengrad();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Button save=(Button)findViewById(R.id.button2);
// save.setOnClickListener(onSave);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
public void Button1_Click(View view)
{
try{
Class clazz = Class.forName("com.example.pikaso_lab3.AndroidBasicsStarter");
Intent intent = new Intent(this,clazz);
startActivity(intent);
}
catch(ClassNotFoundException e){
e.printStackTrace();
}
}
public void Button2_Click(View view)
{
EditText name=(EditText)findViewById(R.id.editText1);
EditText pass=(EditText)findViewById(R.id.editText2);
YuliaKogut.setName(name.getText().toString());
YuliaKogut.setPass(pass.getText().toString());
RadioGroup types=(RadioGroup)findViewById(R.id.radioGroup1);
switch (types.getCheckedRadioButtonId()) {
case R.id.radio0:
YuliaKogut.setRule("user");
break;
case R.id.radio1:
YuliaKogut.setRule("admin");
break;
}
//show message box
AlertDialog alertDialog;
alertDialog = new AlertDialog.Builder(this).create();
alertDialog.setTitle("Лабораторна 3");
alertDialog.setMessage("Name: "+YuliaKogut.getName()+"\nPass: "+
YuliaKogut.getPass()+"\nRule :"+YuliaKogut.getRule());
alertDialog.show();
}
}
//activity_main.xml
<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/textView1"
android:layout_centerHorizontal="true"
android:layout_marginTop="24dp"
android:onClick="Button1_Click"
android:text="Вибір тесту" />
<EditText
android:id="@+id/editText1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/textView1"
android:layout_below="@+id/button1"
android:layout_marginTop="19dp"
android:ems="10"
android:inputType="textPersonName" />
<EditText
android:id="@+id/editText2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/textView1"
android:layout_below="@+id/editText1"
android:ems="10"
android:inputType="textPassword" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/editText1"
android:layout_alignBottom="@+id/editText1"
android:layout_alignParentLeft="true"
android:layout_marginLeft="15dp"
android:text="Логін" />
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/editText2"
android:layout_alignRight="@+id/textView2"
android:text="Пароль" />
<TextView
android:id="@+id/textView4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:text="Права" />
<TextView
android:id="@+id/textView5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/button2"
android:layout_centerHorizontal="true"
android:layout_marginTop="24dp"
android:text="Хомік Володимир" />
<RadioGroup
android:id="@+id/radioGroup1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/editText2"
android:layout_alignRight="@+id/editText1"
android:layout_alignTop="@+id/textView4" >
<RadioButton
android:id="@+id/radio0"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
android:text="Користувач" />
<RadioButton
android:id="@+id/radio1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Адміністратор" />
</RadioGroup>
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:text="@string/hello_world" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/textView2"
android:layout_alignRight="@+id/radioGroup1"
android:layout_below="@+id/radioGroup1"
android:layout_marginTop="35dp"
android:onClick="Button2_Click"
android:text="Зберегти" />
</RelativeLayout>
//Lenengrad.java
package com.example.pikaso_lab3;
public class Lenengrad {
private String name="";
private String pass="";
private String rule="";
public String getName() {
return(name);
}
public void setName(String name) {
this.name=name;
}
public String getPass() {
return(pass);
}
public void setPass(String pass) {
this.pass=pass;
}
public void setRule(String rule)
{
this.rule = rule;
}
public String getRule()
{
return (rule);
}
}
//AndroidBasicsStarter.java
package com.example.pikaso_lab3;
import android.app.ListActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
public class AndroidBasicsStarter extends ListActivity {
String tests[] = { "SingleTouchTest", "MultiTouchTest" };
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setListAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, tests));
}
@Override
protected void onListItemClick(ListView list, View view, int position,
long id) {
super.onListItemClick(list, view, position, id);
String testName = tests[position];
try {
Class clazz = Class
.forName("com.example.pikaso_lab3." + testName);
Intent intent = new Intent(this, clazz);
startActivity(intent);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
//SingleTouchTest.java
package com.example.pikaso_lab3;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.TextView;
public class SingleTouchTest extends Activity implements OnTouchListener {
StringBuilder builder = new StringBuilder();
TextView textView;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
textView = new TextView(this);
textView.setText("Touch and drag (one finger only)!");
textView.setOnTouchListener(this);
setContentView(textView);
}
@Override
public boolean onTouch(View v, MotionEvent event) {
builder.setLength(0);
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
builder.append("down, ");
break;
case MotionEvent.ACTION_MOVE:
builder.append("move, ");
break;
case MotionEvent.ACTION_CANCEL:
builder.append("cancle, ");
break;
case MotionEvent.ACTION_UP:
builder.append("up, ");
break;
}
builder.append(event.getX());
builder.append(", ");
builder.append(event.getY());
String text = builder.toString();
Log.d("TouchTest", text);
textView.setText(text);
return true;
}
}
//MultiTouchTest.java
package com.example.pikaso_lab3;
import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.TextView;
public class MultiTouchTest extends Activity implements OnTouchListener {
StringBuilder builder = new StringBuilder();
TextView textView;
float[] x = new float[10];
float[] y = new float[10];
boolean[] touched = new boolean[10];
private void updateTextView() {
builder.setLength(0);
for(int i = 0; i < 10; i++) {
builder.append(touched[i]);
builder.append(", ");
builder.append(x[i]);
builder.append(", ");
builder.append(y[i]);
builder.append("\n");
}
textView.setText(builder.toString());
}
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
textView = new TextView(this);
textView.setText("Touch and drag (multiple fingers supported)!");
textView.setOnTouchListener(this);
setContentView(textView);
}
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction() & MotionEvent.ACTION_MASK;
int pointerIndex = (event.getAction() & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT;
int pointerId = event.getPointerId(pointerIndex);
switch (action) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_POINTER_DOWN:
touched[pointerId] = true;
x[pointerId] = (int)event.getX(pointerIndex);
y[pointerId] = (int)event.getY(pointerIndex);
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:
case MotionEvent.ACTION_CANCEL:
touched[pointerId] = false;
x[pointerId] = (int)event.getX(pointerIndex);
y[pointerId] = (int)event.getY(pointerIndex);
break;
case MotionEvent.ACTION_MOVE:
int pointerCount = event.getPointerCount();
for (int i = 0; i < pointerCount; i++) {
pointerIndex = i;
pointerId = event.getPointerId(pointerIndex);
x[pointerId] = (int)event.getX(pointerIndex);
y[pointerId] = (int)event.getY(pointerIndex);
}
break;
}
updateTextView();
return true;
}
}
4. Результати виконання тестової програми
/
Рис.2. Основне вікно створеної програми
А - SingleTouchTest Б – MultiTouchTest
ВИСНОВОК
В даній лабораторній роботі я створив новий Android додаток, який викликає Activity для тестів, цим самим оволодів навичками роботи з Android Activity та Activity stack.