FrameLayout (susun atur bingkai)


Pengenalan kepada bahagian ini

FrameLayout boleh dikatakan sebagai yang paling mudah daripada enam reka letak ini secara langsung membuka kawasan kosong pada skrin Apabila kita masuk ke dalam Apabila menambah kawalan, mereka akan diletakkan di sudut kiri atas kawasan ini secara lalai, kaedah reka letak ini tidak mempunyai sebarang kaedah penentududukan, jadi ia tidak digunakan dalam banyak senario yang ditentukan oleh sub-kawalan terbesar Kawalan. Tentukan, jika saiz kawalan adalah sama, maka hanya komponen atas yang boleh dilihat pada masa yang sama , kami juga boleh menghantar atribut layout_gravity , yang ditetapkan ke lokasi lain Selain menunjukkan kepada anda contoh paling mudah, bahagian ini juga membawakan anda dua contoh yang menarik, anda boleh lihat

1 . Atribut biasa

Terdapat dua atribut FrameLayout sahaja, tetapi sebelum kita bercakap mengenainya, mari kita perkenalkan satu perkara:

Imej latar depan: Ia sentiasa berada di bahagian atas reka letak bingkai, secara langsung menghadap imej pengguna, tetapi ia tidak akan menjadi gambar Tindanan.

Dua atribut:

  • android:foreground:*Tetapkan imej latar depan bekas reka letak bingkai

  • android:foregroundGravity:Tetapkan kedudukan di mana imej latar depan dipaparkan

2 Contoh demonstrasi

1) Contoh paling mudah

Perenderan operasi:

1.png

Kod pelaksanaan adalah seperti berikut:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"    
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/FrameLayout1"    
    android:layout_width="match_parent"    
    android:layout_height="match_parent"     
:     " alat    android: foreground="@drawable/logo"    
    android:foregroundGravity="kanan|bawah">    
    
    <TextView    
        android:layout_width="200dp"    
        android:layout_height="200dp" id background.      style /images/android-tutorial-framelayout. html" />    
& lt; TextView
android: Layout_Width = "150dp"
android: Layout_height = "150dp" android: latar belakang = "../ gaya/imej/android-tutorial-framelayout.html"/ >    
     <TextView    
         android:layout_width="100dp"    
                                                                                                                                                                                                                                           . -framelayout.html" / >    
        
</FrameLayout>

Analisis kod: Tiga TextViews ditetapkan kepada saiz dan warna latar belakang yang berbeza, dan ia diliputi dalam urutan Kemudian yang di sudut kanan bawah ialah imej latar depan android:foreground="@drawable/logo" menetapkan gambar imej latar depan, android:foregroundGravity="right|bottom" menetapkan kedudukan imej latar depan di sudut kanan bawah

2) Gadis comel itu bergerak dengan jari

Kesannya adalah seperti berikut:

2.gif

Analisis proses pelaksanaan:

  • langkah 1: Mula-mula tetapkan reka letak main.xml kepada FrameLayout kosong, dan tetapkan latar belakang gambar untuk ia

  • langkah 2: Buat kelas komponen tersuai MeziView baharu yang mewarisi kelas View dan mulakan koordinat awal pandangan dalam kaedah pembinaan

  • langkah 3: Tulis semula kaedah onDraw() , nyatakan kelas berus kosong Paint

  • langkah 4: panggil BitmapFactory.decodeResource() untuk menjana objek bitmap

  • langkah 5: panggil canvas.drawBitmap() melukis objek bitmap gadis itu

  • langkah 6: Tentukan sama ada imej itu dikitar semula, jika tidak imej itu terpaksa dikitar semula

  • langkah 7 : Dapatkan objek susun atur bingkai dalam kod Java utama dan nyatakan kelas MeziView

  • langkah 8: Tambah acara sentuhan pendengar kepada objek mezi instan dan mengatasi kaedah onTouch , tukar koordinat X, Y mezi dan panggil kaedah lukis semula invalidate()

  • langkah 9: Tambahkan objek mezi pada bingkai susun atur

Kod reka letak: main_activity.xml

<FrameLayout xmlns:android="http://schemas.android. com/apk/res/android"
xmlns :tools="http://schemas.android.com/tools"
android:id="@+id/mylayout"
android:layout_width=" match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:background="../style/images/back" >
</FrameLayout>

TersuaiMeziView.java

pakej com.jay.example.framelayoutdemo2;

import android.content.Context; graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint; , diikuti dengan koordinat X, Y bagi kedudukan paparan gadis itu
awam float bitmapX
awam apungan bitmapY
awam MeziView(Konteks Konteks) {
super(konteks); Tetapkan koordinat permulaan gadis itu
bitmapX = 0;
bitmapY = 200;
}

//Tulis Semula View class onDraw() kaedah
@Override
protected void onDraw(( Kanvas kanvas) {
super.onDraw(kanvas);
//Buat dan nyatakan objek Paint
Paint paint = new Paint(); //Hasilkan objek bitmap berdasarkan gambar
Peta bit bit = BitmapFactory.decodeResource(this.getResources(), R.drawable.s_jump); //Tentukan sama ada imej dikitar semula, jika tidak, paksa imej untuk dipulihkan
if(bitmap.isRecycled())
{
bitmap() }
}
}

MainActivity.java:

pakej com.jay.example.framelayoutdemo2;  
  
import android.os.Bundle;  
import android.view.MotionEvent;  
import android.view.View;  
import android.view.View.OnTouchListener;  
import android.widget.FrameLayout;  
import android.app.Aktiviti;  
  
  
Aktiviti Utama kelas awam melanjutkan Aktiviti {  
  
    @Override  
    dilindungi kosong diCreate(Bundle disimpan dalam semula C. (savedInstanceState);  
        setContentView(R.layout.activity_main);  
        FrameLayout frame = (FrameLayout) findViewById(R.id.mylayout);  
        akhir MeziView mezi = baharu MeziView(MainActivity.this);  
        //为我们的萌妹子添加触摸事件监听器  
        mezi.setOnTouchListener(new er  Touch                                     @Override  
            boolean awam onTouch(Lihat paparan, MotionEvent acara) {  
                 / /设置妹子显示的位置  
                mezi.bitmapX = event.getX() - 150;  
                                   map
                 //调用重绘方法   
                mezi. tidak sah();  
                kembalikan benar;  
            }  
       });  
        frame.addView(mezi);  
    }  
}

Penjelasan kod: Lihat langkah-langkahnya adalah sangat mudah untuk menyesuaikan kelas Lihat, mengatasi kaedah lukis semula, kemudian menambah masa sentuhan untuknya dalam Aktiviti dan mengatasi kaedah onTouch. dapatkan masa sentuhan. Klik fokus, dan anda juga memerlukan -150, jika tidak, koordinat ialah penjuru kiri sebelah atas Paparan tersuai, kemudian panggil kaedah lukis semula invalidate() dan akhirnya tambahkannya pada reka letak bingkai!

Muat turun kod:FrameLayoutDemo2.zip

3) Gadis comel berlari

Rendering adalah seperti berikut:

3.gif

Proses pelaksanaan:

  • langkah 1: Tentukan reka letak FrameLayout kosong dan tetapkan kedudukan imej latar depan kepada Kedudukan tengah

  • langkah 2: Dapatkan susun atur FrameLayout dalam Aktiviti, cipta objek Pengendali baharu, ganti kaedah handlerMessage() dan panggil kaedah kemas kini imej

  • langkah 3: Sesuaikan kaedah move() dan tetapkan peta bit secara dinamik yang dipaparkan oleh imej latar depan melalui suis

  • langkah 4: Cipta pemasaan baharu dalam objek pemasa kaedah onCreate(), ganti kaedah larian dan hantar maklumat kosong kepada pengendali setiap 170 milisaat

Kod pelaksanaan ialah seperti berikut:

reka letak Fail:main_activity.xml:

<FrameLayout xmlns:android="http://schemas.android. com/apk/res/android"
xmlns:tools=" http://schemas.android.com/tools" 
android:id="@+id/myframe" 
android:layout_width=" wrap_content" 
android:layout_height="wrap_content" 
android :foregroundGravity="center"> 
</FrameLayout>

MainActivity.java:


pakej com.jay.example.framelayoutdemo3;

import java.util.Timer
import java.util.TimerTask ; Pengendali;
import android.os.Message;
import android.view.View;
import android.view.OnClickListener; app.Activity;
import android.graphics.drawable.Drawable;
kelas awam MainActivity memanjangkan Aktiviti {
//Memulakan pembolehubah, reka letak bingkai
FrameLayout frame = null; Objek kelas pengendali untuk mengemas kini antara muka UI
pengendali baru = handler baru ()
int i = 0; aplikasi ini
if(msg.what == 0x123)
                                                                                                                                                         8 );                                                };          
            
    //定义走路时切换图片的方法    
    void move(int i)       <       <       <        <       < able a = getResources().getDrawable(R.drawable.s_1);    
        Drawable b = getResources().getDrawable(R.drawable.s_2);    
        Drawable c = getResources().getDrawable(R.drawable.s_3);    
        Drawable d = getResources().getDrawable(R.drawable.s_4);    
        Drawable e = getResources().getDrawable(R.drawable.s_5);    
        Drawable f = getResources().getDrawable(R.drawable.s_6);    
        Drawable g = getResources().getDrawable(R.drawable.s_7);    
        Drawable h = getResources().getDrawable(R.drawable.s_8);    
        //通过setForeground来设置前景图像    
        suis(i)    
                                                                                                                   🎜>                frame.setForeground(a);    
                rehat;    
            kes 1:    
                frame.setForeground(b);    
                rehat;    
            kes 2:    
                frame.setForeground(c);    
                pecah;    
            kes 3:    
                frame.setForeground(d);    
                rehat;    
            kes 4:    
                frame.setForeground(e);    
                rehat;    
            kes 5:    
                frame.setForeground(f);    
                rehat;    
            kes 6:    
                frame.setForeground(g);    
                rehat;    
            kes 7:    
                frame.setForeground(h);    
                rehat;    
}
}

@Override
dilindungi void onCreate (bundle savedInstanceState) {
super.oncreate (savedInstanceState);    
        setContentView(R.layout.activity_main);    
            
        frame = (FrameLayout) findViewById(R.id.myframe);    
//Tentukan objek pemasa dan hantar maklumat kepada pengendali dengan kerap
new Timer().schedule(new TimerTask() {
public void run() { 
                                                                                                                                                                                                                                     imej latar depan. 
}





Analisis kod:
Kod ini juga sangat mudah untuk mentakrifkan objek pengendali segarkan imej latar depan reka letak bingkai, dan tentukan Pemasa untuk menghantar maklumat masa setiap 170 milisaat, i++; ini kerana kami menggunakan 8 gambar sebagai bahan animasi!


Muat turun kod:

FrameLayoutDemo3.zipRingkasan bahagian ini

Bahagian ini memperkenalkan FrameLayout (susun atur bingkai), terutamanya menguasai atribut latar depan dan latar depanGraviti Gunakan sahaja! Susun atur bingkai lebih banyak digunakan daripada susun atur jadual sebelumnya! Jika anda berminat, anda boleh cuba menulis beberapa contoh kecil seperti penulis!