やれやれ。
結構苦戦したぜ。
今まで自分が横画面端末に全く興味が無かったので、
横画面の場合のウィジェットサイズに気を配って無かった。
今回IS01対応で色々調べて勉強になった。
結論としては、
縦画面widgetと横画面widgetは縦横比が異なる為、
別々のレイアウトのwidgetを定義しないとダメ。
縦横何れの場合も、
AppWidgetProviderInfoのXMLファイルに設定する、
minWidthとminHeightは共通で、
(74 × サイズ)‐2 dip
で設定する。
例えば、4×1widgetなら、
minWidth=74×4 -1=294dip
minHeight=74-2=72dip
とすればよい。
実際のXMLファイルはこんな感じ
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider
xmlns:android="http://schemas.android.com/apk/res/android"
android:initialLayout="@layout/main4"
android:minHeight="72dip"
android:minWidth="294dip"/>
で、ここからが理解するのに時間がかかったんですが、
上記の294dip×72dipのサイズで実際にwidgetを作るとやたらと小さいwidgetになっちゃいます。
なぜかと言うと、上記のサイズはあくまで最小サイズで、
実際のwidgetのサイズはもっと大きくできるからです。
かつ、この実際のサイズは縦画面と横画面で事なります。
ここが縦、横それぞれ対応しなくてはいけない原因です。
クリフがここ数日躓いていたのは、
上記XMLで指定するサイズと、widgetのレイアウトのサイズを一致させないと行けないと思っていたから。
だけど、そんなことは無くて、上記XMLのサイズは縦横共通で、実際のレイアウトのサイズだけ見直せば良かった。
と言う事で、
明日からようやくCliphWeather横版のデザインに入れそうです。
ああ、勉強になったな~
今日members社主催のソーシャルメディア セミナーに行ってきました。
メインはループス斉藤社長の「ソーシャルコマース」についての講演で、
非常に興味深いものでした。
ソーシャルコマースの定義は、
「ソーシャルメディア×Eコマース」と言う事なので、
結構幅広い概念なのですが、要するにソーシャルメディアの台頭により、
マーケティング手法がどの様に変わるかと言う予測と、米国事例の紹介でした。
主に、ネタ元になっていたのはコトラーの「marketing3.0」で、
その要点は
「一人一人異なる心をもった生活者を意識したマーケティングが必要になる」と言う事、
つまり、マーケティングは対話しながら売買する「商いの原点へ回帰する」と言う事でした。
また、ソーシャルコマースの機能としては、以下の様に整理しています。
<製品開発フェーズ>
1.顧客の生の声を分析し、新しいニーズを発掘
2.プロセスを公開し、商品開発で顧客とコラボレートする
3.試食等の共同体験を通し、ファン心理を醸成
4.売り場では、生活者が交流できる場を提供
5.販売後も、生活者同士が支援し合う場を提供
<販売フェーズ>
1.信頼と動向にもとづく「ともだち」による、ソーシャルレコメンド
2.利用者が仲間を自ら集める共同購入
3.非匿名で信頼性の高い商品レビュー
若干、整理しきれていない様な印象も受けますが、
要するにポイントは、
・顧客を商品・サービス開発・改善に巻き込む事が出来る
・顧客による自発的な販促代理活動が期待できる
と言ったところでしょう。
事例についても類型化して説明して頂いたのですが、ちょっと量があるので割愛します。
(興味があれば斉藤社長のブログをご参照あれ)
今後のソーシャルコマース活用のポイントとして、
以下4つの視点を提起されました。
1.対話の場を提供し、ソーシャル性を深める。
一方的な売り込みは通用しなくなり、友人からのレコメンドが購入意思決定のキーとなる。
→積極的に口コミをアピールしたり、同好者の意見が目に留まる様なサイト設計を心掛けるべき。
※TwitterやFacebookの既存ソーシャルグラフを活用しよう。
2.生活者とともに付加価値を創造する。
商品開発等のプロセスに積極的に顧客を巻き込み、付加価値をともに生み出すべし。
開発プロセスの合理化にもつながるし、その姿勢が顧客の支持を生む。
3.生活者を支援し、生活者に信頼される。
生活者との誠実なコミュニケーションが、派手な広告よりコストパフォーマンスが良い事は、
zapposやGrouponが実証している。
→企業の徹底した顧客志向は顧客に感動を呼び、ソーシャルメディア上での口コミ伝搬効率を飛躍的に高める。
(アドボカシー(顧客支援)マーケティング)
⇒顧客に愛される事がソーシャルコマースで成功するカギ
4.最新のソーシャルトレンドを取り入れる
フラッシュマーケティング(グルポン等)やソーシャルゲーム、チェックインサービス(位置情報)等の最新ソーシャルトレンドを
上手く取り入れて行く。
それから、
現時点では国内でマーケティング利用に適したソーシャルメディアはTwitterのみだが、
この所のFacebookの伸びが著しく、Facebook Japanの話では、彼らが考える一気に普及し出すポイントを既に超えているとの事。
よって、これからはFacebookの企業活用も真剣に検討し始める必要がある。
Twitterはシンプルさがウリであるが、Facebookは逆に非常に奥深いプラットフォームだと言う理解。
9月16日に、members社主催でFacebookのセミナーがあるそうなので、
クリフもこれは参加しとこうかと思います。
で、講演全体を通しての感想ですが、
ソーシャルメディア、ソーシャルコマースの考え方、事例を勉強すればするほど、
これがとんでもなく重要な事であり、同時に物凄く社内的なハードルの高いものである事をジワジワと実感してきました。
今回のセミナーのポイントは、
ずばり、
「顧客に愛される事がソーシャルコマース成功の秘訣である」
と言う事でしょう。
これは生半可な事では無いですよね。
個人や、小規模なベンチャーならいざ知らず、
大企業が多くの顧客に心から愛されるってのは本当に難しいと思います。
また、その重要性を社内で理解させる事もそれ以上に大変です。
何故なら、今まで上手くやってきたノウハウがあるから。
今の体制が充実している、上手くやっている組織なら猶更でしょう。
クリフの会社も、
結構規模が大きいし、顧客対応部門もかなり充実していて、相当なノウハウ蓄積があります。
逆に言えば、
既に顧客との対話が出来る環境はあるはずなんです。
にもかかわらず、それを商品開発、サービス改善にフィードバック出来ているかと言うと、
正直疑問です。
それは、商品の主管部門が直接顧客と接していないからかもしれませんし、
ネガティブな話だけ入ってくるからかもしれません。
何れにしても、
既存の組織が、積み上げて来たやり方を見直し、
顧客中心の体制に再構築する作業と言うのは気が遠くなる様な大手術と言っても言いすぎじゃないでしょう。
到底、一担当がちょこちょこ動いて出来る話ではなく、
経営層号令によるプロジェクトなりで全社的に進めなければ何ともならないレベルのものだと思います。
やれやれ、
書いててなんか胃が痛くなってきたです。。。
果たして、この仕事やり遂げられるだろうか?^^;
CliphWeatherがauのIS01で無駄にスペースを取ってしまう不具合があるらしいが、
原因と思しき情報を発見。
1×1サイズのAppWidgetは100×80。
つまり80×100の比率作られたAppWidgetを100×80で配置する端末で見ると、横に伸びた分だけスケールされながらも比率を守ろうとするので、100×125サイズにスケールされる事になります
「なんだそれだけかよ」と思うかもしれませんが、AppWidgetでサイズが想定外に膨れた場合は他AppWidgetエリアを侵す。。。端末がIS01のようです*1。結果、本来複数個ほど置けるハズなのに、1個しか置けなくなる場合があります。
簡単な対策は、スケールされても比率に依存されない正方形の絵を低いサイズに合わせて用意すると問題無く表示されそうです。
ただし、どうしても横解像度に合ったWidgetにはならないため違和感が生じるので、横端末用に別に作り直すのが一番綺麗な対処法ですが。掛かるコストを考えると気軽に対応できるものでは無いです。
え~。
IS01専用に作るの~???
それは困ったなあ、、、
今後出てくる端末も全部意識しないと行けないって事なのかな。。。。
それはもう個人の対応範囲を超えてるです(泣)
。。。いや、そんなはずは無い。
もう少し調べてみよう。
にしても、ちょっと面倒くさいな~。。。。
今日も引き続き、
androidアプリで画像を描画するテストアプリ作成をしました。
今日はSeekBarを使って色や透明度を変える実験をしました。
何気に苦戦しちゃったけど、何とか思い通りの動きをしてくれました^^
今日書いたコードは以下の感じ。
解説する余力は無いので読み解いてくれ!
package net.cliph.android.drawtest;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.SeekBar;
import android.widget.TextView;public class DrawTest extends Activity {
/** Called when the activity is first created. */private DrawRectView cDraw,vDraw;
private SeekBar a_seek,r_seek,g_seek,b_seek;static final int FP = LinearLayout.LayoutParams.FILL_PARENT;
static final int WC = LinearLayout.LayoutParams.WRAP_CONTENT;@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);//レイアウトパラメータたちを生成
LinearLayout.LayoutParams fpfp =
new LinearLayout.LayoutParams(FP, FP);LinearLayout.LayoutParams wcwc =
new LinearLayout.LayoutParams(WC, WC);LinearLayout.LayoutParams dw_layout =
new LinearLayout.LayoutParams(120, 120);
dw_layout.setMargins(5, 10, 5, 10);LinearLayout.LayoutParams seek_layout =
new LinearLayout.LayoutParams(FP, WC);
seek_layout.setMargins(5, 10, 5, 10);//マスタレイアウトを生成
LinearLayout linearlayout = new LinearLayout(this.getApplicationContext());
linearlayout.setOrientation(LinearLayout.VERTICAL);
linearlayout.setLayoutParams(fpfp);//CreateButtonを生成、マスタレイアウトに設定
Button sbtn =new Button(this.getApplicationContext());
sbtn.setLayoutParams(wcwc);
sbtn.setText(“save_img”);linearlayout.addView(sbtn);
//テキスト追加
TextView r_seek_title = new TextView(this.getApplicationContext());
r_seek_title.setLayoutParams(wcwc);
r_seek_title.setText(“赤の調節”);linearlayout.addView(r_seek_title);
//赤変更シークバーを生成、マスタレイアウトに設定
r_seek = new SeekBar(this.getApplicationContext());
r_seek.setLayoutParams(seek_layout);
r_seek.setMax(255);
r_seek.setProgress(120);
r_seek.setKeyProgressIncrement(10);linearlayout.addView(r_seek);
//テキスト追加
TextView g_seek_title = new TextView(this.getApplicationContext());
g_seek_title.setLayoutParams(wcwc);
g_seek_title.setText(“緑の調節”);linearlayout.addView(g_seek_title);
//緑変更シークバーを生成、マスタレイアウトに設定
g_seek = new SeekBar(this.getApplicationContext());
g_seek.setLayoutParams(seek_layout);
g_seek.setMax(255);
g_seek.setProgress(120);
g_seek.setKeyProgressIncrement(10);linearlayout.addView(g_seek);
//テキスト追加
TextView b_seek_title = new TextView(this.getApplicationContext());
b_seek_title.setLayoutParams(wcwc);
b_seek_title.setText(“青の調節”);linearlayout.addView(b_seek_title);
//青変更シークバーを生成、マスタレイアウトに設定
b_seek = new SeekBar(this.getApplicationContext());
b_seek.setLayoutParams(seek_layout);
b_seek.setMax(255);
b_seek.setProgress(120);
b_seek.setKeyProgressIncrement(10);linearlayout.addView(b_seek);
//テキスト追加
TextView a_seek_title = new TextView(this.getApplicationContext());
a_seek_title.setLayoutParams(wcwc);
a_seek_title.setText(“図形透明度の調節”);linearlayout.addView(a_seek_title);
//透明度変更シークバーを生成、マスタレイアウトに設定
a_seek = new SeekBar(this.getApplicationContext());
a_seek.setLayoutParams(seek_layout);
a_seek.setMax(255);
a_seek.setProgress(120);
a_seek.setKeyProgressIncrement(10);linearlayout.addView(a_seek);
//レイヤー用FrameLayoutを追加
FrameLayout fl = new FrameLayout(this.getApplicationContext());
fl.setLayoutParams(dw_layout);
fl.setBackgroundColor(Color.WHITE);//テキスト追加
TextView back_text = new TextView(this.getApplicationContext());
back_text.setLayoutParams(dw_layout);
back_text.setTextColor(Color.BLACK);
back_text.setText(“cliphcliphcliphcliphcliphcliphcliphcliphcliphcliphcliphcliphcliphcliphcliphcliphcliphcliphcliph”);fl.addView(back_text);
//DrawRectView(独自)をマスタレイアウトに追加
cDraw = new DrawRectView(this.getApplicationContext());
cDraw.setLayoutParams(dw_layout);fl.addView(cDraw);
linearlayout.addView(fl);
Button vbtn = new Button(this.getApplicationContext());
vbtn.setLayoutParams(wcwc);
vbtn.setText(“view_img”);linearlayout.addView(vbtn);
//DrawRectView(独自)をマスタレイアウトに追加
vDraw = new DrawRectView(this.getApplicationContext());
vDraw.setLayoutParams(dw_layout);linearlayout.addView(vDraw);
setContentView(linearlayout);
sbtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO 自動生成されたメソッド・スタブ
Log.d(“DrawTest”,”save_img clicked”);}
});vbtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO 自動生成されたメソッド・スタブ
Log.d(“DrawTest”,”View_img clicked”);}
});a_seek.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// TODO 自動生成されたメソッド・スタブ}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO 自動生成されたメソッド・スタブ}
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
// TODO 自動生成されたメソッド・スタブ
Log.d(“Drawtest”,”onProgressChanged”);
cDraw.DrawRect(a_seek.getProgress(),r_seek.getProgress(),g_seek.getProgress(),b_seek.getProgress());}
});r_seek.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// TODO 自動生成されたメソッド・スタブ}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO 自動生成されたメソッド・スタブ}
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
// TODO 自動生成されたメソッド・スタブ
Log.d(“Drawtest”,”onProgressChanged”);
cDraw.DrawRect(a_seek.getProgress(),r_seek.getProgress(),g_seek.getProgress(),b_seek.getProgress());}
});g_seek.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// TODO 自動生成されたメソッド・スタブ}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO 自動生成されたメソッド・スタブ}
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
// TODO 自動生成されたメソッド・スタブ
Log.d(“Drawtest”,”onProgressChanged”);
cDraw.DrawRect(a_seek.getProgress(),r_seek.getProgress(),g_seek.getProgress(),b_seek.getProgress());}
});b_seek.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// TODO 自動生成されたメソッド・スタブ}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO 自動生成されたメソッド・スタブ}
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
// TODO 自動生成されたメソッド・スタブ
Log.d(“Drawtest”,”onProgressChanged”);
cDraw.DrawRect(a_seek.getProgress(),r_seek.getProgress(),g_seek.getProgress(),b_seek.getProgress());}
});}
}class DrawRectView extends android.view.View {
Bitmap bitmap = null;
Canvas cv;public DrawRectView(Context context) {
super(context);
// TODO 自動生成されたコンストラクター・スタブ
setFocusable(true);
Log.d(“DrawTest”,”DrawRectView Created”);
bitmap = Bitmap.createBitmap(100,100,Bitmap.Config.ARGB_8888);
cv = new Canvas(bitmap);
cv.drawColor(Color.argb(0, 0, 0, 0));
}@Override
protected void onDraw(Canvas canvas) {
// TODO 自動生成されたメソッド・スタブ
super.onDraw(canvas);
Log.d(“DrawTest”,”onDraw”);
canvas.drawColor(Color.argb(0, 0, 0, 0));
canvas.drawBitmap(bitmap, 5, 10,null);}
public void DrawRect(int alpha,int red,int green,int blue){
Log.d(“DrawTest”,”DrawRect argb:”+alpha+” “+red+” “+green+” “+blue);bitmap.eraseColor(0);
int p_color = Color.argb(alpha, red, green, blue);
Paint paint = new Paint();
paint.setStyle(Paint.Style.FILL);
paint.setColor(p_color);
RectF rf = new RectF(0,0,90,90);
cv.drawRoundRect(rf, 5, 5, paint);
invalidate();}
}
クリフは最近、会社のあるサービスでのTwitter活用施策に取り組んでいるんだけど、
何せ、ソーシャルメディア活用ノウハウが無いもんで、
色々なところにヒアリングしたり、セミナーに参加したりして情報収集に励んでます。
でも、やっぱり国内の事例ってそんなに多くなくて、
どこも、とりあえずやって見てる、見たいな感じなんですよね。
一部、頑張ってる所もあるけれど、
あくまでそれはWEBと親和性の高いアーリーアダプターな企業だったりするわけで、
普通の大企業におけるTwitter活用ってのはまだまだこれからってとこみたい。
そんな中、
早くも企業向けにTwitter活用コンサルティングを提供している会社が、
「ループス・コミュニケーションズ」さん。
メンバーズと組んで定期的に開催してるセミナーでいつも社長さんが講演されてるんだけど、
海外の事例等を元に、Twitterをはじめとするソーシャルメディアの具体的な活用方法を話されていて、
企業のTwitter担当者としてはとても為になるセミナーだと思う。
そんな、斉藤社長に今日会いました。
Tシャツ&バックパック姿でipad片手に話す姿は、
まさにベンチャーの社長と言った感じでした。
まあ、コンサルティング契約をしたわけではないので、
あまり深いお話はさせて頂けなかったけれど、
やはり、ソーシャルメディアに関する造形はものすごく深い。
特に、ビジネスとして、企業がソーシャルメディアに取り組む際に、
考えなくては行けない
・目的明確化
・効果検証の確実な実施
・運用体制の確立
・緊急連絡体制の整備
等と言った所を重視する姿勢は、
企業向けコンサルティングのスタンスとして非常に評価できると思った。
ただ、Twitter施策に関して、
現時点で有料のコンサルティングを入れると言うのはかなりハードルが高い。
もし、やるとしても来年以降、
国内のソーシャルメディアがもっともっと盛り上がって来てからの話になる様に思う。
実施、そう言う会社が多い様な事も言っていた。
ま、逆に今年はかなり安いコストでライトなコンサルティングをしてくれる見たいなので、
自分で考えるのが面倒くさいけど、安全にTwitterに取り組んで見たいと言う企業は相談して見ても良いかもしれない。
あ、て言うか、
まずはセミナーに行ってみるのが良いと思います。
ループス・コミュニケーションズ
http://www.looops.net/
どうも、自動更新が機能しないと言う声がチラホラ聞こえてくるので、
アラームのログを取れる機能を実装中。
自分の環境では再現しないトラブルは、
皆さんに状況を教えてもらわないとなんともならんです。。。
さて、
そんなメンテナンスを進めつつ、
今日はandroidアプリ上で、画像を作成する機能の勉強を始めました。
とりあえず、ボタンをクリックすると四角を描画するってとこまでできた^^
新しい事を勉強するのってやっぱり、メンテナンスしてるより楽しいね、やっぱり。
あたりまえか^^;
表題の通り、
自分でも訳の分からないチェック条件を入れていて、
アクションの場合しかNetからの情報取得をしない仕様になってました。。。。
アホか。
やっぱり、
こないだ酔ってコーディングした時だろうな~
利用者の皆様ご迷惑おかけしました。
罪滅ぼしと言ってはなんですが、
ネットワークログ参照の機能を付けました。
これを見れば、
いつ通信して、成功したか失敗したか一目瞭然!
。。。って言うほど立派なもんじゃないけど、
何かあった場合のデバッグに役立つので付けました。
さて、
次は何をやろうかな。
デザイン機能強化もやりたいけどかなり大がかりになりそうだからな。。。
まずは3×1ウィジェット対応を済ませてしまうかね。
うん。そのあとデザイン機能って感じにしよう。
そうしよう。
やれやれ。
やっぱり酔った勢いで集中開発するなんてダメだ。
久しぶりの大ポカをやらかしてしまった。
以前からの俺の課題なんだか、
バージョンアップの際に勢いで前に進む事しか考えられず、
下位互換を考慮し切れない傾向がある。
今回は結構やってしまった。
ほぼ全既存ユーザーにご迷惑をかけてしまっただろう。
無料ツールだからまだ許してもらえているが、
これが事業としてやっているのだったら全くもって笑えない。
でも、おかげで本気で下位互換検証をやる手順を実践できたので、
ユーザーの方には申し訳ないけど、クリフ的には怪我の功名で一歩前進を感じた。
そんな土曜日だった。
クリフの会社でも手探りでTwitterの活用をしてきたけれど、
そろそろ次のステップへ進もうと思っている。
具体的な事は書けないけれど、
多分、ここから先は後戻りしない前提で、
顧客と真剣に向き合って行く必要があると思う。
ソーシャルメディアの難しい所は、
お客さんの生の声を聞いて活用出来る反面、
その声にコントロールされてしまう側面がある事だと思う。
その事を経営層に理解してもらった上で、
会社として誠実な対応が出来るようにしなければならない。
これはきっと簡単なことではないし、
実際にやって実績を上げなければ受け入れられない類の事だと思う。
いくら他社の事例を積み上げても、リスク管理を念頭におかなkればならない、
経営層としては慎重にならざるを得ない事も理解できる。
だから、まずは範囲を限定して、
コミュニケーションを実施し、顧客のフィードバックを真摯に受け止めr、
サービス改善に生かすサイクルを回してみる事で、
その優位性を示さなければならない。
これは非常にチャレンジングだし、
失敗すれば個人的にもかなりのダメージを受ける取り組みだと思う。
しかし、
ここが俺の正念場で、この領域に俺の旗を打ち立てなければならない。
その為の努力は惜しまず、突き進んで行きたいと思う。
若干酔っ払っているので、取りとめない感じだけど、
とにかく、うちの会社のソーシャルメディアは俺が成功させるんだ!!
という事で、お休みなさい。。。。
この間のバージョンアップは機能面の拡充が中心だったので、
今度はデザイン面の改善を図ろうと思います。
とりあえず、フォントの改善に取り組んでますが、
かなり印象変わりますね~
良い感じ^^
それはそれとして、
次のメジャーリリースでは、
デザインテーマを自由にカスタマイズ可能で、
かつそれをみんなで共有出来る様にして見たい!
その為には、
サーバーサイドの開発も必要なわけで、
そこはGAE/Jを活用しようと思ってます。
ソーシャルな時代だからね。
天気予報ウィジェットと言えども、
ソーシャルな機能がなくちゃ面白くないじゃない。
とか言ってしまっているので、
次のリリースは結構大がかりで、時間も掛かると思います。
要望があれば、ボカスカ送って下さい。
細かいものならマイナーバージョンアップは適宜やります。
最近、
仕事も結構忙しくて、英会話なんか始めちゃってたりするので、
中々開発スピードがあげられなかったりするんですが、
睡眠時間を削ってがんばります!!