画像位置を変更した際の通知について

625 views
Skip to first unread message

55555

unread,
Jul 12, 2010, 6:33:32 AM7/12/10
to 日本Androidの会
お世話になっております。
55555です。

初歩的な質問で申し訳ないのですが、ImageViewで表示している画像の位置を
変更した直後に再度位置情報を取得しても、取得するできる値が変更前のもの
になっています。

しばらくしてから再度取得すると、変更後の値が取得できます。

おそらく、
・変更直後に変更の通知処理を行い、位置情報の再取得
・更新通知のイベント受信後に、位置情報の再取得
などを実施すれば、変更後の値を取得できると考えています。

「変更の通知処理」「更新通知のイベント」の取得方法などをご存知の方が
いらっしゃいましたら、ご教授をお願いします。

ちなみに、サンプルソースは以下の通りです。

=====================
Log.d("debug","id [" + imageView.getId() + "]top[" +
imageView.getTop() + "]bottom[" + imageView.getBottom() + "]left[" +
imageView.getLeft() + "]right[" + imageView.getRight() + "]Width[" +
imageView.getWidth() + "]Height[" + imageView.getHeight()+ "]");
imageView.setMaxWidth(32);
imageView.setMaxHeight(32);
imageView.setLayoutParams(new
AbsoluteLayout.LayoutParams(120,120,AbsoluteLayout.LayoutParams.WRAP_CONTENT,AbsoluteLayout.LayoutParams.WRAP_CONTENT));
layout.childDrawableStateChanged(imageView);

imageView.invalidate();
layout.invalidate();
Log.d("debug","id [" + imageView.getId() + "]top[" +
imageView.getTop() + "]bottom[" + imageView.getBottom() + "]left[" +
imageView.getLeft() + "]right[" + imageView.getRight() + "]Width[" +
imageView.getWidth() + "]Height[" + imageView.getHeight()+ "]");
=====================

初期位置は「0,0」にあるため、最初のdebug文でのtop位置が「0」left位置が「0」を
取得できているのですが、位置を変更した後のdebug文においても、
top位置が「0」left位置が「0」が取得できてしまっています。
画面自体の位置は、正しく変更されています。

お手数をおかけいたしますが、ご協力をお願いします。

CHIBA Fumiya (Broadtail, Co. Ltd.)

unread,
Jul 12, 2010, 11:27:26 PM7/12/10
to android-g...@googlegroups.com
千葉です。

レイアウト変更は、アプリからは実施を要求するだけで、実際の変更はフレームワークがタイミングを見計らって行うようです。

変更自体はView#onLayoutで検知できますが、リスナーは存在しないようです。
ImageViewを継承したカスタムViewを作成し、自分でリスナーを実装するのが良いと思います。

(例)
・カスタムView
public class MyImageView extends ImageView {
public MyImageView(Context context) { super(context); }
public MyImageView(Context context, AttributeSet attrs) {
super(context, attrs); }
public MyImageView(Context context, AttributeSet attrs, int defStyle)
{ super(context, attrs, defStyle); }

@Override
protected void onLayout(boolean changed, int left, int top, int right,
int bottom) {
super.onLayout(changed, left, top, right, bottom);
if (changed && mLayoutChangeListner != null) {
mLayoutChangeListner.onLayoutChange(this, left, top, right, bottom);
}
}

OnLayoutChangeListner mLayoutChangeListner = null;
public void setOnLayoutChangeListner(OnLayoutChangeListner listner) {
mLayoutChangeListner = listner;
}
public interface OnLayoutChangeListner {
public void onLayoutChange(MyImageView view, int left, int top, int
right, int bottom);
}
}

・XMLの指定
<com.example.MyImageView android:id=... />

・使い方
myImageView.setOnLayoutChangeListner(new MyImageView.OnLayoutChangeListner() {
@Override
public void onLayoutChange(MyImageView view, int left, int top, int
right, int bottom) {
// 何かの処理
}
});

2010年7月12日19:33 55555 <tachi...@gmail.com>:

> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。
>
>

--
千葉 史哉
f-c...@broadtai.jp

55555

unread,
Jul 13, 2010, 12:16:23 AM7/13/10
to 日本Androidの会
千葉さま

お世話になっております。
55555です。

早速のアドバイスありがとうございます。

> 変更自体はView#onLayoutで検知できますが、リスナーは存在しないようです。

リスナーは存在しないのですね。

早速、カスタムviewを作成して試してみたいと思います。

ありがとうございました。
今後もよろしくお願いします。


On 7月13日, 午後12:27, "CHIBA Fumiya (Broadtail, Co. Ltd.)" <f-
> 2010年7月12日19:33 55555 <tachi55...@gmail.com>:
>
>
>
>
>
> > お世話になっております。
> > 55555です。
>
> > 初歩的な質問で申し訳ないのですが、ImageViewで表示している画像の位置を
> > 変更した直後に再度位置情報を取得しても、取得するできる値が変更前のもの
> > になっています。
>
> > しばらくしてから再度取得すると、変更後の値が取得できます。
>
> > おそらく、
> > ・変更直後に変更の通知処理を行い、位置情報の再取得
> > ・更新通知のイベント受信後に、位置情報の再取得
> > などを実施すれば、変更後の値を取得できると考えています。
>
> > 「変更の通知処理」「更新通知のイベント」の取得方法などをご存知の方が
> > いらっしゃいましたら、ご教授をお願いします。
>
> > ちなみに、サンプルソースは以下の通りです。
>
> > =====================
> > Log.d("debug","id [" + imageView.getId() + "]top[" +
> > imageView.getTop() + "]bottom[" + imageView.getBottom() + "]left[" +
> > imageView.getLeft() + "]right[" + imageView.getRight() + "]Width[" +
> > imageView.getWidth() + "]Height[" + imageView.getHeight()+ "]");
> > imageView.setMaxWidth(32);
> > imageView.setMaxHeight(32);
> > imageView.setLayoutParams(new
> > AbsoluteLayout.LayoutParams(120,120,AbsoluteLayout.LayoutParams.WRAP_CONTEN-T,AbsoluteLayout.LayoutParams.WRAP_CONTENT));
> > layout.childDrawableStateChanged(imageView);
>
> > imageView.invalidate();
> > layout.invalidate();
> > Log.d("debug","id [" + imageView.getId() + "]top[" +
> > imageView.getTop() + "]bottom[" + imageView.getBottom() + "]left[" +
> > imageView.getLeft() + "]right[" + imageView.getRight() + "]Width[" +
> > imageView.getWidth() + "]Height[" + imageView.getHeight()+ "]");
> > =====================
>
> > 初期位置は「0,0」にあるため、最初のdebug文でのtop位置が「0」left位置が「0」を
> > 取得できているのですが、位置を変更した後のdebug文においても、
> > top位置が「0」left位置が「0」が取得できてしまっています。
> > 画面自体の位置は、正しく変更されています。
>
> > お手数をおかけいたしますが、ご協力をお願いします。
>
> > --
> > このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> > このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> > このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
> > 詳細については、http://groups.google.com/group/android-group-japan?hl=jaからこのグループにアクセスしてください。
>
> --
> 千葉 史哉
> f-ch...@broadtai.jp- 引用テキストを表示しない -
>
> - 引用テキストを表示 -
Reply all
Reply to author
Forward
0 new messages