2012年11月30日金曜日

【Android】WebViewに手書き線を書く一つの方法

WebBrowserに手書きしたいなぁなんて思っている人も多いのではないかと思います。 

昨日はその方法をiPhoneにて実現する方法を書きましたが、
今日はAndroid編です!

 まず、Androidのサンプルに、FingerPaintというものがあります。
 このサンプルは、指でなぞった軌跡を表示するというサンプルです。

これをベースにして、そのサンプルとWebViewを融合させます!

 では、まず画像!!!


















昨日とあまり代わり映えしないじゃんかぁ!!!
そりゃそうです^^;;;

iPhoneと同じ機能をAndroidで実現する訳ですから^^
こんな感じで、Webブラウザに手書きが出来てしまいます!!!

このマップ等で、この手書きが役にたちそうですね!
マップ等で場所を○て囲んで、そのスクリーンショットを送るとか!
いろんな使い方が出来るんじゃないでしょうかね?

今回はとっても簡単です!
Androidの場合は、WebViewを拡張すればすぐにできるのです!

ではソースです!
今回はポイントは特にないですかねぇ;;;
onTouchEventにてタッチイベントを取得して、そのイベントに応じて
線を書いていくだけの処理になります!



 
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.webkit.WebView;


public class WritableWebView extends WebView {

 private Path _writedPath = null;
 private Paint _paint = null;
 
 public WritableWebView(Context context) {
  super(context);
  
  _writedPath = new Path();
  _paint = new Paint(Paint.DITHER_FLAG);
  _paint.setAntiAlias(true);
  _paint.setDither(true);
  _paint.setColor(0xFFFF0000);
  _paint.setStyle(Paint.Style.STROKE);
  _paint.setStrokeJoin(Paint.Join.ROUND);
  _paint.setStrokeCap(Paint.Cap.ROUND);
  _paint.setStrokeWidth(12);
 }
 
 public WritableWebView(Context context, AttributeSet attrs) {
  super(context, attrs);
  
  _writedPath = new Path();
  _paint = new Paint(Paint.DITHER_FLAG);
  _paint.setAntiAlias(true);
  _paint.setDither(true);
  _paint.setColor(0xFFFF0000);
  _paint.setStyle(Paint.Style.STROKE);
  _paint.setStrokeJoin(Paint.Join.ROUND);
  _paint.setStrokeCap(Paint.Cap.ROUND);
  _paint.setStrokeWidth(12);
 }
 
 public WritableWebView(Context context, AttributeSet attrs, int defStyle) {
  super(context, attrs, defStyle);
  
  _writedPath = new Path();
  _paint = new Paint(Paint.DITHER_FLAG);
  _paint.setAntiAlias(true);
  _paint.setDither(true);
  _paint.setColor(0xFFFF0000);
  _paint.setStyle(Paint.Style.STROKE);
  _paint.setStrokeJoin(Paint.Join.ROUND);
  _paint.setStrokeCap(Paint.Cap.ROUND);
  _paint.setStrokeWidth(12);
 }
 
 
 @Override
 protected void onSizeChanged(int w, int h, int oldw, int oldh) {
  super.onSizeChanged(w, h, oldw, oldh);
 }
 
 @Override
 protected void onDraw(Canvas canvas) {
  super.onDraw(canvas);
  
  canvas.drawPath(_writedPath, _paint);
 }
 
 private float mX, mY;
 private static final float TOUCH_TOLERANCE = 4;
 
 private void touch_start(float x, float y) {
  _writedPath.reset();
  _writedPath.moveTo(x, y);
  mX = x;
  mY = y;
 }

 private void touch_move(float x, float y) {
  float dx = Math.abs(x - mX);
  float dy = Math.abs(y - mY);

  if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
   _writedPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2);
   mX = x;
   mY = y;
  }
 }

 private void touch_up() {
  _writedPath.lineTo(mX, mY);
 }
 
 @Override
 public boolean onTouchEvent(MotionEvent event) {
  if (_writable == true) {
   float x = event.getX();
   float y = event.getY();
   
   switch (event.getAction()) {
   case MotionEvent.ACTION_DOWN:
    touch_start(x, y);
    invalidate();
    break;
   case MotionEvent.ACTION_MOVE:
    touch_move(x, y);
    invalidate();
    break;
   case MotionEvent.ACTION_UP:
    touch_up();
    invalidate();
    break;
   }
   return true;
  }
  else {
   return super.onTouchEvent(event);
  }
 }
}


こんな感じです!
あとは、このViewに対して、HTMLを読み込むようにすれば良いだけです!

こんな感じ


 
  WritableWebView webview = (WritableWebView)findViewById(R.id.webview);
  webview.getSettings().setJavaScriptEnabled(true);
  webview.loadUrl("http://developerwaiwai.blogspot.jp/");


どうです?
簡単でしょ?

画像に落としたい場合には、DrawCacheを取得して、保存すればOK!

いじょ、Android版のWebブラウザ手書き機能についてでした!






2012年11月29日木曜日

【iPhone,iPad】UIWebViewに手書き線を書く一つの方法

世の中には同じ事を考えている方がいますね^^;;;

iPhoneやiPadのUIWebでタッチイベントを取得する方法ってのは、
結構見つかります!
以下なんかがそうですね!

http://blog.syuhari.jp/archives/2141
http://d.hatena.ne.jp/yuum3/20100714/1279091415

じゃぁタッチイベント取得したら、カスタマイズして手書き機能を
追加して、指でなぞった軌跡をオーバーレイする事できるんじゃないか?

そう思って調べたところ、上記にもある通り、UIWebViewってのは
複雑で謎の多いViewである事で、単純にはいきません。。。

じゃぁどうするか!!!
今日は、その方法を示したいと思います。

まずは画像!

















はい!
こんな風に出来ちゃいます!
iPhoneシミュレータでの実行結果です。

答えは簡単!!!
UIWebViewの上に透明なViewをのせれば良いのです!
UIViewから新たにタッチイベントに反応して描画するViewを作ります!
ソースは以下から!


ポイントは16〜20行目!
Viewのバックグラウンド色を透明に設定しています。
ちなみに16行目のopaqueはあまり関係ないみたい;;;


@interface WritableView : UIView {
    UIBezierPath* _path;
}

@end

 
 @implementation WritableView

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        self.opaque = YES;
        self.backgroundColor = [UIColor colorWithWhite:1.0f alpha:0.0f];
        self.autoresizesSubviews = YES;
        self.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
        self.contentMode = UIViewContentModeScaleToFill;
        
        _path = [UIBezierPath bezierPath];
        _path.lineCapStyle = kCGLineCapRound;
        _path.lineJoinStyle = kCGLineJoinRound;
    }
    return self;
}


- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event
{
    UITouch* touch = [[event touchesForView:self] anyObject];
    CGPoint touchedLocation = [touch locationInView:self];
    
    [_path removeAllPoints];
    [_path moveToPoint:touchedLocation];
    
}


- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch* touch = [[event touchesForView:self] anyObject];
    CGPoint movedLocation = [touch locationInView:self];
    
    [_path addLineToPoint:movedLocation];
    [self setNeedsDisplay];
}


- (void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event
{
    [self setNeedsDisplay];
}


- (void)drawRect:(CGRect)rect
{
    [[UIColor redColor] setStroke];
    _path.lineWidth = 5;
    
    [_path stroke];
}


@end



このViewを、UIViewController等で、UIWebViewの上に作ってあげれば
良いのです!

こんな感じ!

writableView = [[WritableView alloc] initWithFrame:frame];
[webView.superview addSubView:writableView];

どうです?
簡単でしょ?

次回はAndroid版を書きます!

2012年11月27日火曜日

AndroidやiPhoneでWordPressを自在に操る1つの方法

CMSとして、ブログツールとして人気を博しているWordPressですが、
AndroidやiPhoneでみると、レイアウトが崩れたり、プラグインを導入
しても、思った通りのデザインにならなかったりしますよね!

かといって、RSS配信をしていても、RSS配信の個数制限があったりで、
なかなか全部のWordPressの情報を引き出せなかったり。。。

そんなのとおさらばする方法があるんです!

ズバリ!!!

XML-RPC

という技術です!

RPC(Remote Procedure Call)という名がついている通りリモート呼び出しです!

つまり、クライアントから、サーバーの機能を呼び出せちゃう訳です!
この技術を使うと、なんとAndroidやiPhoneからサーバーの機能を
直呼びして、より高度な事が出来るようになります!

例えば、

モバイル端末である数値を入力し、複雑な演算を行って、結果を表示する
というアプリがあったとして、複雑な演算が端末では重すぎるなんて時
の状況を考えてみましょう!

端末で入力した数値を、サーバーに送って、その数値の演算をサーバーに
行ってもらい、結果だけを表示できるなんて事が出来たら、高速演算などにも
役に立ちますよね!

そんな時は、XML-RPC等を使えば良いのです!

詳しくは、
http://ja.wikipedia.org/wiki/XML-RPC

と、それじゃぁ、Androidとサーバーでのやり取りをXML-RPCで
行うにはどうすればいいんだ?
そういった時は、以下のライブラリを使います!

http://code.google.com/p/android-xmlrpc/


使い方は簡単!
ソースを、自分のプロジェクトにコピーするだけ!

後は、例にも書いてありますが、

XMLRPCClient client = new XMLRPCClient("http://example.com");
int result = client.call("add", 2, 4);


これだけです!
どう簡単でしょ?

実は、WordPressにはXML-RPC機能が既に備わっています。
APIも公開されています!

http://codex.wordpress.org/XML-RPC_WordPress_API

ほら!
もう出来たも同然!!!


これで、もう、モバイル端末での表示に困る事はないですね!

Let's try!!!



2012年11月26日月曜日

私のスマホのデスクトップを公開〜私のデスクトップを醸しちゃいます〜

みなさん!!!
スマートフォンを買ったり機種交換して、こんな経験ありませんか?

最初からあまり使わないアプリがごっそり入っているし、
DLしたアプリもいっぱいあってわからない!

もう、スマートフォンってわからないし難しい!!!


そんなもったいない!!!

確かに、アプリがごっそり入っていてわかりにくいってのは
わかります!
でもそれで、食わず嫌いになるのはもったいない!!!


実際私の愛機もこんな感じです!

この画面は、私の愛機でアプリドロアー(アプリを起動する画面)を表示したところです^^;;;
下の方を見てください!

2/5って、こんなのがあと4画面あるってことです^^;;;







こんなあったら訳が分からなくなります^^;;;
しかも目的のアプリ見つけるのも大変^^;;;

ところが、私のデスクトップ画面はスッキリしています!!!
こんな感じです!

私が茨城県にいる事をかもしちゃってますね〜^^;;;














私のデスクトップはこの2枚だけです!
しかもアイコンは置きません!!!

アイコンを置くとゴチャってして嫌なんです^^;;;

それじゃぁ、目的のアプリ立ち上げはドロアーからやるのかっていうと、前述の通り、5枚のアプリドロアーの中から探すのは困難なので、やりません!!!
そんなの面倒です!!!

そこで、「なんでもらんちゃ〜」の出番です!
まず、どういったアプリなのか、実際見てもらいましょう!!!
これです!

そうです!
自分の使うアプリだけを登録制にすることで、自分だけの自分のための使いやすいスマートフォンに変身させる事が出来るのです!


しかも、標準のデスクトップ等とは違って、アプリと一緒に自分のよく行くサイト等も、一緒に登録しておくことが出来るようにしています!!!



Google検索もココから行けますよ!

しかも、カテゴリ分けも出来ますので、自分の使いたいアプリとサイトを登録して、カテゴリで分ける事でスッキリ整理する事が出来るんです!!!

後は、これを、前のデスクトップ画像で示した(右下)のように、「なんでもらんちゃ〜」をすぐに起動できるように登録すれだけで良いのです!!!

これで、サイトやアプリをデスクトップに置く必要がなくなりますので、
デスクトップをスッキリ整理する事が出来るのです!!!

どうでしょうか?
みなさんのスマートフォンを、自分だけの、自分にとって使いやすい、オリジナルスマートフォンを作ってみませんか?

仕事の連絡も、遊びの連絡も、様々な情報集めも、すんなりはかどること間違いなし!

「なんでもらんちゃ〜」を是非お使いあれ〜^^


2012年11月23日金曜日

なんでもらんちゃ〜アップデート!

今日

なんでもらんちゃ〜
なんでもらんちゃ〜SA

の両アプリをアップデートしました!

今回のアップデートの内容は、
・背景の壁紙化
です!


え〜、たぶん見た目的には今までで一番の変化じゃないでしょうかね^^

今までは、背景を黒一色で統一してきましたが、背景を変えたい等の要望が
何件か入ってきていたので、前々から検討はしていた項目になります!

まー、見てもらえば一発ですよね!
こんな感じです!


 


なんか背景があるだけで全然違うアプリになった様な感じですね!
かっこいい!!!
(自分で言っちゃったよ^^;;;)


背景を壁紙にしていますので、デスクトップと一体感があります!!!
もちろん壁紙を変更すれば、変更結果が背景に反映されます!!!
ライブ壁紙と呼ばれる、動く壁紙にももちろん対応しています!

ほんと一体感があって、いい感じで動作してくれます!!!

前の黒一色も設定により可能なので、お好みにより使い分けて頂ければ
と思います!

繰り返しになってしまいますが、デスクトップとほんと一体感が
あるので、ほんとアプリなのって感じの使い心地になりますので、

シンプルさと便利さと一体感をうまくマッチさせたアプリ

「なんでもらんちゃ〜(無料)」
「なんでもらんちゃ〜SA(有料)」

を是非とも一度ご体験ください!!!

2012年11月21日水曜日

絶賛発熱中(^ ^)/

ただいま絶賛発熱中(^ ^)/
熱が下がりません><


書きたい事はあるのですが、また今度^^

書きたい事

・達成記事
・なんでもらんちゃ〜アップデートしようかな記事

など!


絶賛発熱が終了したらまた記事書きます^^


今日はこの辺にて!

2012年11月18日日曜日

無料版ぱすわ〜ど帳アップデート

うぅぅ。。。
体調悪い><

また風邪ひいたか?


昨日の事ですが、ぱすわ〜ど帳を若干修正してアップデートしました!
アップデートの主な内容は、

MoreAppsボタンをおすすめ機能ボタンへ
おすすめ機能ボタンのデザイン変更
おすすめ機能にヘルプ等を追加

という点です!

あれ?
困ったという時等に、ヘルプを出したり、サポートメールを
したりするのを、よりわかりやすくするためです!

もし、まだわかりにくいようでしたら、また考えます!!!
ユーザーによりわかりやすく、より直感的なUIを目指してます!!!


体調悪いので今日はこんなところで><