Animation in Android/Kotlin

View animation in Android is a system that allows you to add smooth, tweened animations to your app’s Views. This means you can control how elements like buttons, images, and layouts change their appearance over time, creating a more engaging and dynamic user experience.

Here are some key things to know about view animation in Android:

Types of animations:

  • Tween animation: This is the most common type, where you define the starting and ending values for various properties like alpha (transparency), rotation, scale, and translation (position). The system automatically calculates the intermediate values to create a smooth transition.
  • Frame animation: This involves displaying a sequence of images rapidly to create the illusion of movement.

Implementing animations:

There are two main ways to implement view animations:

  • Using pre-defined animations: Android provides several built-in animation resources like fade in, fade out, rotate, and scale. You can load these animations from XML files and apply them to your Views.
  • Creating custom animations: For more complex animations, you can use the Animation class or the newer Animator class to define your own animation properties and timing.

View animation, in the context of Android development, refers to the process of adding smooth transitions and movements to the elements on your app’s screen. These elements, called Views, can be anything from buttons and images to layouts and text boxes. By animating their properties like size, position, transparency, and rotation, you can create a more visually appealing and engaging experience for your users.

Android Model Paper

BCA Sem. 6 – CS-31 | Android with Kotlin (July-2022)

Download

Android Kotlin Checkbox example

MainActivity.kt

package com.example.checkboxdemo

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
// author : www.raviroza.com
// date : 2-Jan-2023, 9.00 am
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity()
{
    var ch = mutableSetOf("")
    fun setChoices()
    {
        var t = ""
        for(tt in ch)
        {
            t = t + tt + " "
        }
        lblChoiceList.text = t.toString()
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        /*chkCricket.setOnClickListener()
        {
            if(chkCricket.isChecked == true)
            {
                ch.add(chkCricket.text.toString())
            }
            else
            {
                ch.remove(chkCricket.text.toString())
            }
            lblChoiceList.text = ch.toString()
        }
        chkFootBall.setOnClickListener()
        {
            if(chkFootBall.isChecked == true)
            {
                ch.add(chkFootBall.text.toString())
            }
            else
            {
                ch.remove(chkFootBall.text.toString())
            }
            lblChoiceList.text = ch.toString()
        }
        chkKabbadi.setOnClickListener()
        {
            if(chkKabbadi.isChecked == true)
            {
                ch.add(chkKabbadi.text.toString())
            }
            else
            {
                ch.remove(chkKabbadi.text.toString())
            }
            lblChoiceList.text = ch.toString()
        }

        chkFootBall.setOnClickListener()
        {
            lblChoiceList.text = lblChoiceList.text.toString() + chkFootBall.text.toString()
        }
        chkKabbadi.setOnClickListener()
        {
            lblChoiceList.text = lblChoiceList.text.toString() + chkKabbadi.text.toString()
        }*/


       chkCricket.setOnCheckedChangeListener { buttonView, isChecked ->
            if (isChecked)
            {
                ch.add(buttonView.text.toString())
                setChoices()
            }
            else
            {
                ch.remove(buttonView.text.toString())
                setChoices()
            }
        }
        chkFootBall.setOnCheckedChangeListener { buttonView, isChecked ->
            if (isChecked)
            {
                ch.add(buttonView.text.toString())
                setChoices()
            }
            else
            {
                ch.remove(buttonView.text.toString())
                setChoices()
            }
        }
        chkKabbadi.setOnCheckedChangeListener { buttonView, isChecked ->
            if (isChecked)
            {
                ch.add(buttonView.text.toString())
                setChoices()
            }
            else
            {
                ch.remove(buttonView.text.toString())
                setChoices()
            }
        }
    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="4dp"
android:background="@color/MainColor"
    tools:context=".MainActivity" >

    <LinearLayout
        android:background="@color/SubColor"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginStart="8dp"
        android:layout_marginLeft="8dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginRight="8dp"
        android:layout_marginBottom="8dp"
        android:orientation="vertical"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <TextView
            android:id="@+id/lblHead"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="4dp"
            android:background="#2196F3"
            android:gravity="center"
            android:text="Check Box Demo"
            android:textColor="#232031"
            android:textSize="30sp" />

        <TextView
            android:id="@+id/lblSubHead"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="4dp"
            android:gravity="center"
            android:text="Select Your Game"
            android:textSize="18sp" />

        <CheckBox
            android:id="@+id/chkCricket"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="4dp"
            android:text="@string/cricket"
            android:textSize="18sp" />

        <CheckBox
            android:id="@+id/chkKabbadi"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="4dp"
            android:text="@string/Kabbadi"
            android:textSize="18sp" />

        <CheckBox
            android:id="@+id/chkFootBall"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="4dp"
            android:text="@string/Football"
            android:textSize="18sp" />

        <TextView
            android:id="@+id/lblHereAreYourChoices"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="4dp"
            android:gravity="center"
            android:background="#4876a8"
            android:text="Your Choices are "
            android:textSize="18sp" />

        <TextView
            android:id="@+id/lblChoiceList"
            android:layout_width="match_parent"
            android:layout_height="301dp"
            android:layout_margin="4dp"
            android:gravity="center_horizontal"
            android:text=".... "
            android:textSize="18sp" />

    </LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

Android Kotlin SQLite Demo

Here is the example of Android with Kotlin SQLite database in Android Studio.

MainActivity.kt

package com.example.sqlitedemo

import android.content.Context

// Author : www.raviroza.com
// Date : 26-Dec-2022, 10.00 am

import android.database.Cursor
import android.database.sqlite.SQLiteDatabase
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Toast
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

    lateinit var DB : SQLiteDatabase
    lateinit var QRY : String
    lateinit var CURSOR : Cursor

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        DB = openOrCreateDatabase("MyDB", Context.MODE_PRIVATE,null)

        Toast.makeText(this,DB.path.toString(),Toast.LENGTH_LONG).show()

        QRY = "CREATE TABLE IF NOT EXISTS student(rollno VARCHAR,name VARCHAR,marks VARCHAR);"

        DB.execSQL(QRY)

        Toast.makeText(this,"Table Created !",Toast.LENGTH_LONG).show()
        loadData()

        btnAdd.setOnClickListener()
        {
            QRY = "insert into student values ( ${txtRollNo.text} , '${txtName.text}' , ${txtMarks.text} )"
            DB.execSQL(QRY)
            Toast.makeText(this,"Record Inserted !",Toast.LENGTH_LONG).show()
            txtName.text = null
            txtMarks.text = null
            txtRollNo.text = null
            loadData()

        }

    }
    fun loadData()
    {
        QRY = "Select * from Student "
        CURSOR = DB.rawQuery(QRY,null)
        var data : String = ""
        while (CURSOR.moveToNext())
        {
            data += CURSOR.getString(0) + "\n"
            data += CURSOR.getString(1) + "\n"
            data += "-------------------------------\n"
        }
        if(data.length==0) {

            lblResult.text = "No Records Found"
        }
        else
        {
            lblResult.text = data
        }
    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:layout_margin="16dp"
    tools:context=".MainActivity">

<!--    Author : www.raviroza.com-->
<!--    Date : 26-Dec-2022, 10.00 am-->

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="DB App Demo - Student"
        android:textSize="25dp"
        android:gravity="center"
        android:background="@color/colorAccent"
        android:padding="8dp"
         />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Enter Roll No. :"
        android:textSize="20dp"
        />

    <EditText
        android:id="@+id/txtRollNo"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="0"
        android:inputType="number"
        android:textSize="20dp"

        />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Enter Name :"
        android:textSize="20dp"
        />

    <EditText
        android:id="@+id/txtName"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="20dp"
        />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Enter Marks:"
        android:textSize="20dp"
        />

    <EditText
        android:id="@+id/txtMarks"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="20dp"
        android:inputType="number"
        />

    <Button
        android:id="@+id/btnAdd"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="25dp"
        android:text="Add Record"
        android:textAllCaps="false"
        />
    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

    <TextView
        android:id="@+id/lblResult"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="4dp"
        android:text="student data"
        android:textSize="18dp"
        />

    </ScrollView>

</LinearLayout>

Android PHP MySql Service example

Here is the example of PHP service for Android application, PHP service allows an android app to access remote data from the database server

Example is divided in two parts

  • Android : contains the files to be created for Android Application
    1. Java file for Android Main Activity file
    2. Java file to add a record to MySql database table
    3. Java POJO file for Student details
  • PHP: contains the files to be created for PHP service
    1. PHP file to create database and table
    2. PHP file to insert record
    3. PHP file to select data in JSON format

Android Files

AndyPhpMainActivity.java

package com.example.andyphpservice;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

public class AndyPhpMainActivity extends Activity
{
	final String URLSelect = "http://10.0.2.2:81/Andy/select.php";
	final String URLInsert = "http://10.0.2.2:81/Andy/insert.php";
	
	EditText edSno,edName,edCity;
	TextView tvData;
		
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_andy_php_main);
                       
        edSno = (EditText) findViewById(R.id.txtSno);
        edName = (EditText) findViewById(R.id.txtSname);
        edCity = (EditText) findViewById(R.id.txtCity);
        
        tvData = (TextView) findViewById(R.id.txtData);
        
        new DBSelect(getApplicationContext(),URLSelect, tvData).execute();
    }      
    public void add(View v)
    {
    	// add record to student table
    	Student stu = 
    				new Student(edSno.getText().toString(),
    					edName.getText().toString(),
    					edCity.getText().toString());
    	DBInsert ins = new DBInsert(getApplicationContext(), URLInsert, stu);
    	ins.execute();    	
    	new DBSelect(getApplicationContext(),URLSelect, tvData).execute();
    }
    public void refresh(View v)
    {
    	// refresh data in text view
    	new DBSelect(getApplicationContext(),URLSelect, tvData).execute();    	
    }
}

Student.java

package com.example.andyphpservice;

public class Student
{
	private String sno,sname,scity;
	
	public Student(String sno, String sname, String scity) {
		super();
		this.sno = sno;
		this.sname = sname;
		this.scity = scity;
	}

	public String getSno() {
		return sno;
	}

	public void setSno(String sno) {
		this.sno = sno;
	}

	public String getSname() {
		return sname;
	}

	public void setSname(String sname) {
		this.sname = sname;
	}

	public String getScity() {
		return scity;
	}

	public void setScity(String scity) {
		this.scity = scity;
	}
}

DBInsert.java

package com.example.andyphpservice;

import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;

import android.content.Context;
import android.os.AsyncTask;
import android.util.Log;
import android.widget.Toast;

public class DBInsert extends AsyncTask<Void, Void, Void>
{
	String url;
	Student stu;
	
	Context cx;
	public DBInsert(Context cx, String url, Student stu)
	{
		this.url = url;
		this.stu = stu;
		this.cx = cx;
	}
	@Override
	protected Void doInBackground(Void... arg0)
	{
		List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
        nameValuePairs.add(new BasicNameValuePair("sno", stu.getSno()));
        nameValuePairs.add(new BasicNameValuePair("sname", stu.getSname()));
        nameValuePairs.add(new BasicNameValuePair("scity",stu.getScity())); 
        
        try
        {
            HttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(url);
            httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
            HttpResponse response = httpClient.execute(httpPost); 
            //HttpEntity entity = response.getEntity();
            Log.e("DBInsert", "insert is in progress");            
        }
        catch (Exception e)
        {
        	Log.e("DBInsert", e.toString());           
        }
		return null;
	}
	@Override
	protected void onPostExecute(Void result) {
		// TODO Auto-generated method stub
		super.onPostExecute(result);
		Toast.makeText(cx, "data inserted ! ", Toast.LENGTH_LONG).show();
		Log.e("DBInsert", "insert success");
	}
}

DBSelect.java

package com.example.andyphpservice;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;
import org.json.JSONObject;

import android.content.Context;
import android.os.AsyncTask;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;

public class DBSelect extends AsyncTask<Void, Void, Void>
{
	String url;
	Student stu;
	
	InputStream is = null;
	String line = null;
	String result = null;
	List<String> list=null;
	
	TextView tv;
	
	String st = "";
	Context cx;
	
	public DBSelect(Context cx, String url, TextView tvData)
	{
		this.url = url;
		this.tv = tvData;
		this.cx = cx;
		//this.stu = stu;
	}
	@Override
	protected Void doInBackground(Void... arg0)
	{
		try
		{				
			HttpClient httpClient = new DefaultHttpClient();				
			HttpPost httpPost = new HttpPost(url);
			HttpResponse response = httpClient.execute(httpPost);
			HttpEntity entity = response.getEntity();
			is = entity.getContent();
		
			BufferedReader reader = new BufferedReader 
					(new InputStreamReader(is, "iso-8859-1"), 8);
			StringBuilder sb = new StringBuilder();
			while ((line = reader.readLine()) != null)
			{
				sb.append(line + "\n");
			}
			is.close();
			result = sb.toString();
				
			JSONArray ja = new JSONArray(result);
			JSONObject jo = null;
			list = new ArrayList<String>();
			for (int i = 0; i < ja.length(); i++)
			{
				jo = ja.getJSONObject(i);		
				st = st + jo.getInt("sno") + " | " +
						jo.getString("sname") + " | " +
						jo.getString("scity") + "\n";
//				list.add(jo.getInt("sno")+" | "+ 
//						jo.getString("sname")+" | "+
//						jo.getString("scity")
//						);
			}
		}
		catch (Exception e)
		{	Log.e("Db Select", e.toString());	}
		return null;
	}
	@Override
	protected void onPostExecute(Void result) {
		// TODO Auto-generated method stub
		super.onPostExecute(result);
		//tv.setText(list.toString());
		Toast.makeText(cx, "Data Refreshed", Toast.LENGTH_LONG).show();
		tv.setText(st);
		Log.e("DBSelect", "select success");
	}
}

activity_andy_php_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/LinearLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".AndyPhpMainActivity" >
       
    <EditText
        android:id="@+id/txtSno"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:hint="student no." />
		<requestFocus />
		
    <EditText
        android:id="@+id/txtSname"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:hint="student name" />
    
    <EditText
        android:id="@+id/txtCity"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="student city"
        android:ems="10" >
        
    </EditText>

    <Button
        android:id="@+id/btnAdd"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Add" 
        android:onClick="add"
        />
    
    <Button
        android:id="@+id/btnRefresh"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Refresh"
        android:onClick="refresh"
         />

    <ScrollView
        android:id="@+id/scrollView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical"
             >
            
            <TextView
            android:id="@+id/txtData"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:text="Student Data"
            android:textAppearance="?android:attr/textAppearanceMedium" />
            
        </LinearLayout>


    </ScrollView>

</LinearLayout>

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.andyphpservice"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-permission android:name="android.permission.INTERNET"/>
    
    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.andyphpservice.AndyPhpMainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

PHP Files

DBCreate.php

<?php
$con=mysqli_connect("localhost","root","root");

$sql="CREATE DATABASE DbAndy";

if (mysqli_query($con,$sql))
{
   echo "Database DbAndy created successfully !";
}
?>

TableCreate.php

<?php
$con=mysqli_connect("localhost","root","root","dbAndy");

$sql="CREATE TABLE tblStudent (sno int(3),sname CHAR(30),scity CHAR(30))";

if (mysqli_query($con,$sql))
{
   echo "Table (tblStudent) bas been created successfully !";
}
?>

Index.html

<html>
<head>
	<title>Student Entry | www.raviroza.com</title>
</head>

<body>
<form action="Insert.php" method="POST"> 

	<h1>	Student Data Entry	</h1>
	<p>	Number : <input type="text" name="sno">	</p>
	<p>	Name :	 <input type="text" name="sname">			</p>
	<p>	City :	 <input type="text" name="scity">			</p>
	<p>	<input type="submit" value = "Add" >								</p>
	
</form>
</body>
</html>

Index.php

<?php
$con=mysqli_connect("127.0.0.1","root","root","dbAndy");

if (mysqli_connect_errno($con))
{
   echo "Failed to connect to MySQL: " . mysqli_connect_error();
}

$sno = $_POST['sno'];
$sname = $_POST['sname'];
$scity = $_POST['scity'];

$result = mysqli_query($con,"Insert Into tblStudent(sno,sname,scity) values ('$sno','$sname' , '$scity')");

echo "PHP | Student Record Inserted. Done  !!!";

mysqli_close($con);

?>

Select.php

<?php 

$con=mysqli_connect("127.0.0.1","root","root","dbAndy");

if (mysqli_connect_errno($con))
{
   echo "Failed to connect to MySQL: " . mysqli_connect_error();
}

$sql = "SELECT * FROM tblStudent";

$r = mysqli_query($con,$sql);

$result = array();

while($row = mysqli_fetch_array($r))
{
	$flag[] = $row;
//	echo ($row[0] . "<br>" . $row[1] . "<br>" . $row[2]);
//	echo ($row[1]);
//	echo ($row[2]);
}
print(json_encode($flag));
mysqli_close($con);

?>

Output