月別アーカイブ: 2013年3月

非Retinaイメージ作成ツール公開

Retina用イメージから非Retina用イメージを作るのが面倒なので、簡単なツールをつくってみました。

ダウンロード↓
RetinaImageShrinker.zip (247 ダウンロード)

スクリーンショット
retinashrinker1

png、jpgファイルをFinderからDROPすると、縦横のサイズをそれぞれ50%にリサイズした画像を生成し、同じ場所に保存します。
また、同時に、もとのファイル(retina用)をリネームして拡張子の前に例の”@2x”を付けてくれます。

例.
hoge.png を dropすると
 ↓
hoge.png — 生成された非Retina用イメージ
hoge@2x.png — dropしたファイル

もちろん”@2x”付きのファイルをdropしてもOKです。

例.
hoge@2x.png を dropすると
 ↓
hoge.png — 生成された非Retina用イメージ
hoge@2x.png — dropしたファイル(なにもしない)

もし、”@2x”付きのファイルが既に存在したときは拡張子の前にアンダーバーを付けてリネームされます。

例.
hoge.png を dropすると
 ↓
hoge.png — 生成された非Retina用イメージ
hoge@2x.png — もともと存在していたファイル
hoge@2x_.png — dropしたファイル

このようにdropしたファイルやretina用だと思われるファイルは勝手に消さないようにしています。
一方で非retina用として生成されるファイルは問答無用で上書きしますのでご注意下さい。

非商用、商用問わず自由に使って頂いて結構ですが、
このアプリケーションを使用した事により、いかなる損害が発生しても作者は一切の責任を負いません。
自己責任でご利用下さい。

[更新履歴]

ver1.0.3
・高さ、幅が1ピクセルのイメージを縮小した時に不正なイメージが生成される不具合を修正

アクティビティ呼び出し時に値を受け渡すサンプル

呼び出し元のActivity
UriとStringを渡しています。

Intent intent = new Intent(this,NextActivity.class);
intent.putExtra("key_filename", filename);
intent.putExtra("key_uri",  Uri.parse("xxxxxx"));
startActivity(intent);

呼び出されたActivity

Intent intent = getIntent();
Bundle bundle = intent.getExtras();
String filename = bundle.getString("key_filename ");
Uri uri = (Uri)bundle.get("key_uri");

BACKボタンが押された時に特定の処理を行う方法

androidの特徴的な機能である戻るボタン、これが押されると通常は前のactivityにもどりますが
別の処理をさせる方法です。

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {

  if(keyCode==KeyEvent.KEYCODE_BACK){

    //ここに記述
  }
  
  return super.onKeyDown(keyCode, event);
}

戻り値にtrueを返すと、キーイベントは消費されたことになり、次のレシーバーへ通知されません。
(つまり、前のactivitiに戻りません)
falseを返すと次のレシーバーが処理を行います。

SeekBarを画像でカスタマイズ

Seekbarの背景画像とつまみを画像で変更する方法です。

下記のようなxmlをdrawableに用意して

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
  <item android:id="@android:id/background" >
    <bitmap android:src="@drawable/seekbar_image"></bitmap>
  </item>

  <item android:id="@android:id/progress" >
    <clip>
      <bitmap android:src="@drawable/seekbar_prog_image"></bitmap>
    </clip>
  </item>
</layer-list>

※ seekbar_image、seekbar_prog_imageはpngなどのdrawableリソース

このxmlをdrawableをprogressDrawableにセットすればOKです。

今回はコードでの設定例

Drawable drawable = getResources().getDrawable(R.drawable.seekbar);
seekBar.setProgressDrawable(drawable);

つまみを変更する時は下記のようにthumbに設定すればいいようです。

Drawable drawable = getResources().getDrawable(R.drawable.seekbar_thumb);
seekBar.setThumb(drawable);

Activityの履歴を消す

画面が
 A → B → C → D
と遷移して最後のDからAに戻るとします。
Aに戻るときも

Intent intent = new Intent(FinalActivity.this, MainActivity.class);
startActivity(intent);

みたいな感じですよね。きっと。

そうした時に端末の「戻る」ボタンが押された時にAからDへ戻ってしまうわけです。
これはマズい!嫌だ!

戻るボタンを利用不可にしたり、D→C→B→A と finish() をさせていったり。
面倒な事をしていたのですが、どうやら簡単に解決できるらしいです。

それがこれです

Intent intent = new Intent(FinalActivity.this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

2行目のIntent.FLAG_ACTIVITY_CLEAR_TOPを指定することで履歴(?)をクリアしてくれます。

Androidで回転するViewを非表示にするとき

回転するイメージボタンを非表示にする処理があったのですが、ちょっと躓きましたのでメモ

ボタンを回転させるにはやはりアニメーションでしょう!ってことで

RotateAnimation rotate = new RotateAnimation(0, 90, button.getWidth()/2, target.getHeight()/2);
rotate.setDuration(200);
rotate.setFillAfter(true);
button.startAnimation(rotate);

って感じで回転させてたのです。これはこれでOK

で、問題はこのボタンを非表示にする時。

button.setVisibility(View.INVISIBLE);

とかしても、消えない。消えないよぉ・・なんでだよぉ・・・
百歩譲ってアニメーション中ならわかるけど、回転終わってるじゃん。。

いろいろ頭にきますが、こんなときはアニメーションをクリアすれば消えます。

button.clearAnimation();
button.setVisibility(View.INVISIBLE);

で、さらに問題が、こんどはこれを表示するときなんですけど、当然同じ回転角で表示したいのです。

普通考えるとこんな感じ

button.setRotation(angle);
button.setVisibility(View.VISIBLE);

でもapi8(android2.2)では setRotation が使えないのです。
こまった。
で、WEBを検索するとアニメーションで時間を0にすればいいよ!との冗談みたいな方法が
至る所で書かれていたわけです。
まじですか。

しょうがないのでこんな感じで実装しました。かなしい。

RotateAnimation rotate = new RotateAnimation(0, 90, button.getWidth()/2,target.getHeight()/2);
rotate.setDuration(0);
rotate.setFillAfter(true);
button.startAnimation(rotate);

button.setVisibility(View.VISIBLE);

UIViewに枠線を付ける方法

layerを使う事で実現できます。

#import <QuartzCore/QuartzCore.h>

UIView* view = [[[UIView alloc]initWithFrame:CGRectMake(0, 0, 40, 40)]autorelease];

//↓赤枠を2ptで描画
[view.layer setBorderColor:[UIColor redColor].CGColor];
[view.layer setBorderWidth:2.0];

[self.view addSubview:view];

cocoaって良く出来てると思います。

画像が劣化しまくっとる! \(*`∧´)/

今になって気がついたのですが、なぜかUpした画像がめちゃめちゃ劣化しています。
先日Upした橋の画像なんて、夜空がガッタガタ!なんじゃこれーー!

Lightroomでは等倍で見てもそんな事はなかったので、どこで劣化しているのか。。。

このサイトでは、iphoneで撮った画像はサイト内に保存して表示しているのですが、
デジイチで撮った画像はLightroomから直接Flickrに上げて、それを表示するようにしてます。

LightroomからFlickrに上げる所で劣化しているのかな???

NSArray に構造体を格納する方法

いっつも忘れるのでメモ


//格納
GLKVector3 unit_vec = GLKVector3Make(1.0, 0.0, 0.0);
[self.xxxxArray addObject:[NSValue value:&unit_vec withObjCType:@encode(GLKVector3)]];


//取り出し
NSValue* valueCntn = [self.xxxxArray  objectAtIndex:1];
GLKVector3 unit_vec;
[valueCntn  getValue:&unit_vec];


なぜ、これが覚えられないか。
たぶん @encode ってのがよくわかってないからだw