メモソフトを作ってみる(線色、太さ、透明度、カメラ取込、保存の機能を付けた) 

 一応これで完成。ラジオボタンの間隔が詰められれば良いのだが。画面が狭いので極力ボタンを少なくした。メニューキー等の物理ボタンを使うと長押しすると文字入力パレットが出てきてしまうので使えず。線色、太さ、透明度の機能は簡単に出来る。カメラからの取込も、ketaiライブラリを使えば簡単に出来る。減色もフィルタを使えば簡単。エッジ検出は以前書いたWinodws版を使ったが、Windowサイズに微修正が必要で、そこが少し悩んだ。
 指先でスマートフォンサイズだと書ける文字はこれが限界。

 カメラからの取込。

 減色。

 エッジ検出。

 当然、カメラ画像にも書き込める。再度カメラ画像を読むとクリアされるけど。

 以下ソース。
import apwidgets.*;
import ketai.camera.*;
KetaiCamera cam;
PImage img;
PImage age;
int c=0;//ageピクセル位置
int fx;
int fy;
int R,G,B,a;//色情報
int w;//画面幅
int h;//画面高
String pass;

APWidgetContainer widgetContainer;//GUIイベント通信
APButton button1;
APButton button2;
APButton button3;
APRadioGroup radioGroup1;
APRadioGroup radioGroup2;
APRadioGroup radioGroup3;
APRadioGroup radioGroup4;
APRadioButton Radio1;
APRadioButton Radio2;
APRadioButton Radio3;
APRadioButton Radio4;
APRadioButton Radio5;
APRadioButton Radio6;
APRadioButton Radio7;
APRadioButton Radio8;
APRadioButton Radio9;
APRadioButton Radio10;
APCheckBox checkBox1;


void setup(){
background(0);
orientation(LANDSCAPE);
//imageMode(CENTER);
frameRate(20);
w=width;//画面幅
h=height;//画面高

cam = new KetaiCamera(this, w, h, 24);

textSize(20);//size
widgetContainer=new APWidgetContainer(this);
button1=new APButton(0,0,100,50,"セーブ");
button2=new APButton(w-100,0,100,50,"クリア");
button3=new APButton(0,h-50,100,50,"カメラ");
widgetContainer.addWidget(button1);
widgetContainer.addWidget(button2);
widgetContainer.addWidget(button3);

radioGroup1=new APRadioGroup(0,h-260);
radioGroup1.setOrientation(APRadioGroup.VERTICAL);//垂直にグループを配置
Radio1=new APRadioButton("フル");
Radio2=new APRadioButton("減色");
Radio3=new APRadioButton("エッジ");
radioGroup1.addRadioButton(Radio1);//ボタン追加
radioGroup1.addRadioButton(Radio2);
radioGroup1.addRadioButton(Radio3);
Radio1.setChecked(true);
widgetContainer.addWidget(radioGroup1);

radioGroup2=new APRadioGroup(w-100,40);
radioGroup2.setOrientation(APRadioGroup.VERTICAL);//垂直にグループを配置
Radio4=new APRadioButton("黒");
Radio5=new APRadioButton("赤");
Radio6=new APRadioButton("青");
Radio7=new APRadioButton("緑");
Radio8=new APRadioButton("白");
radioGroup2.addRadioButton(Radio4);//ボタン追加
radioGroup2.addRadioButton(Radio5);
radioGroup2.addRadioButton(Radio6);
radioGroup2.addRadioButton(Radio7);
radioGroup2.addRadioButton(Radio8);
Radio4.setChecked(true);
widgetContainer.addWidget(radioGroup2);

radioGroup3=new APRadioGroup(0,90);
radioGroup3.setOrientation(APRadioGroup.VERTICAL);//垂直にグループを配置
Radio9=new APRadioButton("普");
Radio10=new APRadioButton("太");
radioGroup3.addRadioButton(Radio9);//ボタン追加
radioGroup3.addRadioButton(Radio10);
Radio9.setChecked(true);
widgetContainer.addWidget(radioGroup3);

checkBox1=new APCheckBox(0,35,"半透");
widgetContainer.addWidget(checkBox1);

age = createImage(w+10, h, ARGB);
}

void draw(){
if(Radio1.isChecked()){
}

if(Radio3.isChecked()){
}

if(Radio4.isChecked()){
R=0;
G=0;
B=0;
a=255;
}
if(Radio5.isChecked()){
R=255;
G=0;
B=0;
a=255;
}
if(Radio6.isChecked()){
R=0;
G=0;
B=255;
a=255;
}
if(Radio7.isChecked()){
R=0;
G=255;
B=0;
a=255;
}
if(Radio8.isChecked()){
R=255;
G=255;
B=255;
a=255;
}

if(Radio9.isChecked()){
strokeWeight(5);
}
if(Radio10.isChecked()){
strokeWeight(20);
}
if(checkBox1.isChecked()){
a=126;
}

if(mousePressed) {
stroke(R,G,B,a);
line(mouseX, mouseY, pmouseX, pmouseY);

}
}

void onClickWidget(APWidget widget){
if(widget==button1){
pass="//sdcard//DCIM/"+str(year())+"年"+str(month())+"月"+str(day())+"日 "+str(hour())+"時"+str(minute())+"分"+str(second())+"秒.png";
save(pass);

}
if(widget==button2){
background(0);
}
if(widget==button3){
image(cam, 0,0);
cam.start();
if(Radio2.isChecked()){
filter(POSTERIZE, 4);
} //Radio2.isChecked

if(Radio3.isChecked()){
loadPixels(); //画面全体の色情報を配列pixelsとして読み込む
for(int j=0;j