Tutoriais

Aplicativo de Celular

Aqui vai uma explicação detalhada do desenvolvimento de um aplicativo de celular

Iniciando o projeto randomExpressions

Para começar crie um projeto novo.

O package name pode ser random.expressions

AndroidManifest.xml

O android:theme é modelo antigo.
O ícone vai dentro da pasta res/drawable
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">

	<application
		android:allowBackup="true"
		android:icon="@drawable/icon"
		android:label="expressions"
		android:theme="@android:style/Theme.Light.NoTitleBar"
		android:resizeableActivity="true">
		<activity
			android:exported="true"
			android:name=".MainActivity"
			android:label="expressions">
			<intent-filter>
				<action android:name="android.intent.action.MAIN" />
				<category android:name="android.intent.category.LAUNCHER" />
			</intent-filter>
		</activity>
	</application>

</manifest>

Pasta raw

Dentro da pasta /main/res/ vão 13 imagens e um arquivo html.
São arquivos que contêem os pedaços das caras que são sorteadas para serem exibidas na tela.

Extraia e coloque o conteúdo na pasta /main/res/raw/

Webview

O arquivo html contém código css e javascript que misturam as imagens para gerar expressões.
Esse arquivo é renderizado em uma webview que é um recurso do desenvolvimento android.
Uma webview é como um pedaço de um navegador. A webview renderiza código html, css e js e exibe dentro do app.

Posteriormente código java tira screenshot da tela html que está renderizada na webview.

Salvando screenshot programaticamente

expressionView.setDrawingCacheEnabled(true);
Bitmap bitmap=Bitmap.createBitmap(expressionView.getDrawingCache());
expressionView.setDrawingCacheEnabled(false);
Intent intent=new Intent("android.intent.action.SEND");
intent.setType("image/jpeg");
intent.putExtra("android.intent.extra.STREAM",Uri.parse(MediaStore.Images.Media.insertImage(getContentResolver(),bitmap,String.valueOf((long)System.currentTimeMillis()),"expression")));
MainActivity.this.startActivity(Intent.createChooser(intent,""));
Esse código faz o app tirar um screenshot quando o user clica no botão.
O screenshot é salvo e aparece a opção de compartilhar.

LinearLayout

LinearLayout é um elemento android que posiciona componentes na tela do aplicativo.
LinearLayout linearLayout=new LinearLayout(this);
linearLayout.setOrientation(linearLayout.VERTICAL);

Webview

Webview é um pedaço de uma janelinha de um navegador que vai no linearLayout.
WebView expressionView=new WebView(this);
expressionView.getSettings().setJavaScriptEnabled(true);
expressionView.loadUrl("file:///android_res/raw/index.htm");
linearLayout.addView(expressionView);

Botão que tira a Screenshot

O Button também é adicionado ao linearLayout.
Button button=new Button(this);
button.setText("save");
LinearLayout.LayoutParams lp1=new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.MATCH_PARENT);
lp1.gravity=Gravity.CENTER_HORIZONTAL;
button.setLayoutParams(lp1);
button.setHeight(120);
button.setWidth(220);
button.setOnClickListener(new View.OnClickListener(){public void onClick(View view){
	expressionView.setDrawingCacheEnabled(true);
	Bitmap bitmap=Bitmap.createBitmap(expressionView.getDrawingCache());
	expressionView.setDrawingCacheEnabled(false);
	Intent intent=new Intent("android.intent.action.SEND");
	intent.setType("image/jpeg");
	intent.putExtra("android.intent.extra.STREAM",Uri.parse(MediaStore.Images.Media.insertImage(getContentResolver(),bitmap,String.valueOf((long)System.currentTimeMillis()),"expression")));
	MainActivity.this.startActivity(Intent.createChooser(intent,""));
}});
linearLayout.addView(button);

ScrollView

O ScrollView serve para uma situação de quando a tela precisa ser rolada.
Nesse caso provavelmente isso não acontece mas existem situações em que há mais elementos no linearLayout e para que o app exiba todos o linearLayout vai dentro da ScrollView.
ScrollView scrollView=new ScrollView(this);
scrollView.setBackgroundColor(new Color().parseColor("#e1e8f0"));
scrollView.addView(linearLayout);

setContentView(scrollView);

O código completo

package random.expressions;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.webkit.WebView;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.graphics.Color;
import android.widget.RelativeLayout.LayoutParams;
import android.view.Gravity;

public class MainActivity extends Activity{
	WebView expressionView;
	@Override protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		LinearLayout linearLayout=new LinearLayout(this);
		linearLayout.setOrientation(linearLayout.VERTICAL);
		
		expressionView=new WebView(this);
		expressionView.getSettings().setJavaScriptEnabled(true);
		expressionView.loadUrl("file:///android_res/raw/index.htm");
		linearLayout.addView(expressionView);
		
		Button button=new Button(this);
		button.setText("save");
		LinearLayout.LayoutParams lp1=new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.MATCH_PARENT);
		lp1.gravity=Gravity.CENTER_HORIZONTAL;
		button.setLayoutParams(lp1);
		button.setHeight(120);
		button.setWidth(220);
		button.setOnClickListener(new View.OnClickListener(){public void onClick(View view){
			expressionView.setDrawingCacheEnabled(true);
			Bitmap bitmap=Bitmap.createBitmap(expressionView.getDrawingCache());
			expressionView.setDrawingCacheEnabled(false);
			Intent intent=new Intent("android.intent.action.SEND");
			intent.setType("image/jpeg");
			intent.putExtra("android.intent.extra.STREAM",Uri.parse(MediaStore.Images.Media.insertImage(getContentResolver(),bitmap,String.valueOf((long)System.currentTimeMillis()),"expression")));
			MainActivity.this.startActivity(Intent.createChooser(intent,""));
		}});
		linearLayout.addView(button);
		
		ScrollView scrollView=new ScrollView(this);
		scrollView.setBackgroundColor(new Color().parseColor("#e1e8f0"));
		scrollView.addView(linearLayout);
		setContentView(scrollView);
	}
}

Arquivos do Projeto

O app expressions é baseado em webview.

Nesse app o código java gera uma imagem png a partir do layout de uma página exibida na tela e disponibiliza para o usuário a opção de compartilhar.