3

プログラムでビューを変更することに実際にはあまり自信がないので、次の問題があります。

ユーザーが構成する必要がある 2 つの重要なオプションがあるため、アプリの最初の起動時に、ユーザーに設定を確認するように指示するメイン画面のオーバーレイが必要です。

AlertDialog私はウィザードを使用したくありません。そこで、Go SMS と同様のアプローチを採用し、初回起動時にオーバーレイを作成することにしました。私が作成したモックアップは次のようになります。

通常メニュー: 普通

最初の開始: ここに画像の説明を入力

だから、これらは私が持っている問題です:

  1. 私が言ったように、最初の起動時にオーバーレイするスクリーンショットを使用したくありません.
  2. 円をpngとして持っていますが、画像の上に正確に配置する方法がわかりません
  3. テキストと同じ問題
  4. 最後に、アプリの上に半透明の白を置きたいと思います。アイコン用の穴は必ずしも必要ではありませんが、あると便利です。

レイアウト ソースが必要な場合は、pastebinで入手できます。

したがって、LayoutInflater または ViewStub を使用する方がよい場合、およびそれを実現する方法については、ここから始める必要があります。これはまったく経験がないためです...

ありがとう!

/編集:新しい、よりよく整理されたレイアウトをアップロードしました。

4

2 に答える 2

1

私は同様の問題に直面しました.クライアントは、オーバーレイの吹き出しで説明されているボタンを除いて、画面全体を白くする必要があるアプリケーションのウォークスルーを望んでいました.
幸いなことに、あなたのレイアウトは、私が作業しなければならなかったレイアウトほど複雑ではありません:)

これで、透明効果を 2 つの方法で取得できます。背景を白にしてすべてのビューの setAlpha() メソッドを呼び出す方法と、半透明の白いオーバーレイを作成する方法です。
オーバーレイを使用する場合は、オーバーレイを介して不透明なボタンを表示する方法を見つける必要があります。これは少し複雑になる可能性があります。最初のオプションを使用する場合は、不透明なビューで setAlpha(1) を表示するだけです。

setAlpha() メソッドは api バージョン 11+ からのみ使用できるため、それ以前のバージョンをターゲットにする場合は、もう少し複雑な方法で行う必要がある場合があります。
ハニカム前のビューにアルファを設定する例:

ボタンのレイアウト (好きなように作成してください。ループできるように類似させてください):

<LinearLayout 
    android:id="@+id/button1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical">
    <ImageView 
        android:tag="image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/tile"/>
    <TextView 
        android:tag="text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#FF000000"
        android:text="button1"/>
</LinearLayout>

プログラムで、ボタンを透明にしたい場合:

LinearLayout l = (LinearLayout) findViewById(R.id.button1);
((ImageView)l.findViewWithTag("image")).setAlpha(0x7F);
((TextView)l.findViewWithTag("text")).setTextColor(0x7F000000);



透明効果を作成する方法を決定したら、オーバーレイ テキスト/バブルを表示する方法を決定する必要があります。これをレイアウト全体の上にある別のレイヤーに配置して、新しいビューの影響を受けないようにすることをお勧めします。
これを実現する 1 つの方法は、ルート レイアウト要素を FrameLayout に変更し、これを作成/表示することです。例えば:

<FrameLayout background="#FFFF"> <!-- white background, just in case -->
    <LinearLayout>
        <!-- the rest of your layout -->
    </LinearLayout>
    <LinearLayout visibility="gone"> <!-- this will be your overlay view -->
        <ImageView /> <!-- the arrow/ring -->
        <TextView /> <!-- the description -->
    </LinearLayout>
</FrameLayout>

イントロダクションが表示される場合、非表示のオーバーレイ ビューの位置を説明するテーブル アイテムの位置に設定し、テキストを適切な文字列/リソースに変更してビューを表示します。

紹介が終わったら、すべてのボタンのアルファ値をリセットし、オーバーレイの可視性を再び非表示に設定します。

于 2011-12-15T12:03:05.960 に答える
0

私は ViewStub の経験があまりないので、LayoutInflater を使用します。

まず、現在のレイアウトの上に 2 番目のレイアウトをロードする必要があります。最も簡単なのは、現在のビューを 1 つの子として持ち、最初の起動時に 2 番目の子を動的にロードする FrameLayout を持つことです。コンテンツ ビューをアクティビティに読み込むと、既に作成されているいくつかのビュー (DecorView、FrameLayout など) にアタッチされます。そのため、既存の FrameLayout を再利用するか、新しいものを作成することができます。より安定しているため、2番目のソリューションに投票します(レイヤーの数を最小限に抑えたい場合に備えて、他の可能性について言及しました)。

したがって、最初のステップとして、現在のレイアウトを FrameLayout 内にラップし、id を付けます。たとえば、「@id/root」とします。

次に、onCreate メソッドで、次のようなものを使用できます。

setContentView(R.layout.main);
if (isFirstRun()) {
    ViewGroup parent = (ViewGroup)findViewById(R.id.root); // locate the FrameLayout
    LayoutInflater li = LayoutInflater.from(this); // get an instance of LayoutInflater
    li.inflate(R.layout.overlay, parent);
}

ここまでで、オーバーレイがロードされました。オーバーレイを定義するのはあなた次第です。ホワイトニング エフェクトを作成するには、overlay.xml レイアウトのルート ビューに次の属性を設定するだけです。

android:background="#40ffffff"

円を配置するには、まずその場所を見つける必要があります。View.getLocationOnScreen を使用して、画面上のアイコン (円の下) の絶対座標を取得できます。次に、次の 2 つのオプションがあります。

  • カスタム ビュー (オーバーレイ用) を作成し、指定された場所に円を手動で描画します。
  • または ImageView を使用して円を追加し、座標に基づいて左マージンと上マージンを調整します
于 2011-12-15T11:44:51.563 に答える