ব্যবহারকারী ইন্টারফেস

এই দস্তাবেজটি কীভাবে গ্লাস শৈলী অনুসরণ করতে হয় এবং আপনার ব্যবহারকারীর অভিজ্ঞতাকে অপ্টিমাইজ করতে পারে এমন সাধারণ UI সর্বোত্তম অনুশীলনগুলি প্রয়োগ করতে হয়। এটি নিম্নলিখিত UI উপাদানগুলিকে কভার করে:

থিম

আমরা আপনাকে যে গ্লাস থিমটি ব্যবহার করার পরামর্শ দিই তার নিম্নলিখিত বৈশিষ্ট্য রয়েছে:

  • কোনো অ্যাকশন বার ছাড়াই পূর্ণ-স্ক্রীনে কার্যক্রম দেখায়।
  • একটি কঠিন-কালো পটভূমি প্রয়োগ করে।
  • কালার এজ ইফেক্টের জন্য কালার লাইটার সেট করে।
  • একটি সাদা পাঠ্য রঙ প্রয়োগ করে।

নিম্নলিখিতগুলি গ্লাসের জন্য প্রস্তাবিত থিম সেটিংস:

 <style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
   <item name="android:windowBackground">@android:color/black</item>
   <item name="android:colorEdgeEffect">@android:color/white</item>
   <item name="android:textColor">@android:color/white</item>
 </style>

XML লেআউট

এখানে দুটি মৌলিক কার্ড লেআউট রয়েছে যা আপনার টুকরোগুলি স্ফীত করতে পারে:

প্রধান বিন্যাস

এই লেআউটটি একটি কার্ডের জন্য প্রস্তাবিত স্ট্যান্ডার্ড প্যাডিং এবং ফুটার সংজ্ঞায়িত করে। খালি FrameLayout আপনার নিজস্ব মতামত রাখুন।

কেন্দ্রের বাক্সটি 560 বাই 240 পিক্সেলের স্ক্রিনের বেশিরভাগ অভ্যন্তরীণ অংশ নেয়, নীচে একটি ছোট বার রয়েছে যা 560 বাই 40 পিক্সেল। এছাড়াও চারটি ছোট 40 বাই 40 পিক্সেল ব্লক রয়েছে, প্রতিটি কোণে একটি করে

এখানে একটি উদাহরণ XML বিন্যাস:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

  <FrameLayout
      android:id="@+id/body_layout"
      android:layout_width="0dp"
      android:layout_height="0dp"
      android:layout_margin="@dimen/glass_card_margin"
      app:layout_constraintBottom_toTopOf="@id/footer"
      app:layout_constraintEnd_toEndOf="parent"
      app:layout_constraintStart_toStartOf="parent"
      app:layout_constraintTop_toTopOf="parent">

    <!-- Put your widgets inside this FrameLayout. -->

  </FrameLayout>

  <!-- The footer view will grow to fit as much content as possible while the
         timestamp view keeps its width. If the footer text is too long, it
         will be ellipsized with a 40dp margin between it and the timestamp. -->

  <TextView
      android:id="@+id/footer"
      android:layout_width="0dp"
      android:layout_height="wrap_content"
      android:layout_marginStart="@dimen/glass_card_margin"
      android:layout_marginEnd="@dimen/glass_card_margin"
      android:layout_marginBottom="@dimen/glass_card_margin"
      android:ellipsize="end"
      android:singleLine="true"
      android:textAppearance="?android:attr/textAppearanceSmall"
      app:layout_constraintBottom_toBottomOf="parent"
      app:layout_constraintEnd_toStartOf="@id/timestamp"
      app:layout_constraintStart_toStartOf="parent" />

  <TextView
      android:id="@+id/timestamp"
      android:layout_width="0dp"
      android:layout_height="wrap_content"
      android:layout_marginEnd="@dimen/glass_card_margin"
      android:layout_marginBottom="@dimen/glass_card_margin"
      android:ellipsize="end"
      android:singleLine="true"
      android:textAlignment="viewEnd"
      android:textAppearance="?android:attr/textAppearanceSmall"
      app:layout_constraintBottom_toBottomOf="parent"
      app:layout_constraintEnd_toEndOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

বাম কলাম লেআউট

এই লেআউটটি একটি এক-তৃতীয়াংশ প্রস্থের বাম কলাম এবং দুই-তৃতীয়াংশ প্রস্থের ডান কলামকে দুটি FrameLayout ক্লাসের আকারে সংজ্ঞায়িত করে যা আপনি আপনার মতামত রাখতে পারেন। একটি উদাহরণ দেখতে নিম্নলিখিত ছবি উল্লেখ করুন.

240 বাই 360 পিক্সেলে একটি বাম কলাম দেখায়, যা মূল লেআউটকে ঠেলে দেয়। এটির আকার মাপসই করার জন্য চাপ দেয়, প্রধান এলাকাটি 330 বাই 240 পিক্সেল, একটি ছোট নিম্ন বার যা 330 বাই 40 পিক্সেল। ডান দুই কোণে দুটি ছোট 40 বাই 40 পিক্সেল বাক্স রয়েছে এবং আরও চারটি 30 বাই 40 পিক্সেল বাক্স রয়েছে, দুটি বাম কলামের নীচের কোণে এবং দুটি মূল বিন্যাসের বাম দিকে, একটি উপরে এবং একটি নীচে

এখানে একটি উদাহরণ XML বিন্যাস:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

  <FrameLayout
      android:id="@+id/left_column"
      android:layout_width="0dp"
      android:layout_height="match_parent"
      android:background="#303030"
      app:layout_constraintBottom_toBottomOf="parent"
      app:layout_constraintStart_toStartOf="parent"
      app:layout_constraintTop_toTopOf="parent"
      app:layout_constraintWidth_percent=".333">

    <!-- Put widgets for the left column inside this FrameLayout. -->

  </FrameLayout>

  <FrameLayout
      android:id="@+id/right_column"
      android:layout_width="0dp"
      android:layout_height="0dp"
      android:layout_marginTop="@dimen/glass_card_two_column_margin"
      android:layout_marginStart="@dimen/glass_card_two_column_margin"
      android:layout_marginBottom="@dimen/glass_card_two_column_margin"
      android:layout_marginEnd="@dimen/glass_card_margin"
      app:layout_constraintBottom_toTopOf="@id/footer"
      app:layout_constraintEnd_toEndOf="parent"
      app:layout_constraintStart_toEndOf="@id/left_column"
      app:layout_constraintTop_toTopOf="parent">

    <!-- Put widgets for the right column inside this FrameLayout. -->

  </FrameLayout>

  <!-- The footer view will grow to fit as much content as possible while the
         timestamp view keeps its width. If the footer text is too long, it
         will be ellipsized with a 40dp margin between it and the timestamp. -->

  <TextView
      android:id="@+id/footer"
      android:layout_width="0dp"
      android:layout_height="wrap_content"
      android:layout_marginStart="@dimen/glass_card_margin"
      android:layout_marginEnd="@dimen/glass_card_margin"
      android:layout_marginBottom="@dimen/glass_card_margin"
      android:ellipsize="end"
      android:singleLine="true"
      android:textAppearance="?android:attr/textAppearanceSmall"
      app:layout_constraintBottom_toBottomOf="parent"
      app:layout_constraintEnd_toStartOf="@id/timestamp"
      app:layout_constraintStart_toEndOf="@id/left_column" />

  <TextView
      android:id="@+id/timestamp"
      android:layout_width="0dp"
      android:layout_height="wrap_content"
      android:layout_marginEnd="@dimen/glass_card_margin"
      android:layout_marginBottom="@dimen/glass_card_margin"
      android:ellipsize="end"
      android:singleLine="true"
      android:textAlignment="viewEnd"
      android:textAppearance="?android:attr/textAppearanceSmall"
      app:layout_constraintBottom_toBottomOf="parent"
      app:layout_constraintEnd_toEndOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

স্ট্যান্ডার্ড মাত্রা

পূর্ববর্তী লেআউট বা আপনার নিজের লেআউটগুলির সাথে একত্রে নিম্নলিখিতগুলি ব্যবহার করুন একটি ফাইল তৈরি করতে যা গ্লাসের স্ট্যান্ডার্ড শৈলী মেনে চলে৷ আপনার Android প্রকল্পে res/values/dimens.xml হিসাবে এই ফাইলটি তৈরি করুন।

<?xml version="1.0" encoding="utf-8"?>
<resources>

  <!-- The recommended margin for the top, left, and right edges of a card. -->
  <dimen name="glass_card_margin">40dp</dimen>

  <!-- The recommended margin between the bottom of the card and the footer. -->
  <dimen name="glass_card_footer_margin">50dp</dimen>

  <!-- The recommended margin for the left column of the two-column card. -->
  <dimen name="glass_card_two_column_margin">30dp</dimen>

</resources>

আমরা আপনাকে মেনু তৈরি করতে RecyclerView ব্যবহার করার পরামর্শ দিই। এগুলি অ্যান্ড্রয়েড স্টুডিও প্রকল্প সংস্থান থেকে স্ট্যান্ডার্ড অ্যান্ড্রয়েড মেনু ফাইলের উপর ভিত্তি করে হওয়া উচিত। অ্যান্ড্রয়েড আপনাকে স্ট্যান্ডার্ড মেনু তৈরিকে ওভাররাইড করতে এবং এটিকে আপনার বাস্তবায়নের সাথে প্রতিস্থাপন করতে দেয়। এটি করতে, এই পদক্ষেপগুলি অনুসরণ করুন:

  1. RecyclerView এর সাথে লেআউট তৈরি করুন এবং এটিকে আপনার Activity ভিউ হিসেবে সেট করুন।
  2. মেনু আইটেমগুলির নতুন তৈরি সংগ্রহ ব্যবহার করতে RecyclerView এবং এর অ্যাডাপ্টার সেট করুন।
  3. onCreateOptionsMenu পদ্ধতি ওভাররাইড করুন।
    1. আপনার মেনু স্ফীত করুন এবং প্রতিটি মেনু আইটেমের জন্য সংগ্রহে আপনার নতুন উপাদান যোগ করুন।
    2. অ্যাডাপ্টারে notifyDataSetChanged পদ্ধতিতে কল করুন।

    কোটলিন

        override fun onCreateOptionsMenu(menu: Menu): Boolean {
            val menuResource = intent
                .getIntExtra(EXTRA_MENU_KEY, EXTRA_MENU_ITEM_DEFAULT_VALUE)
            if (menuResource != EXTRA_MENU_ITEM_DEFAULT_VALUE) {
                menuInflater.inflate(menuResource, menu)
                for (i in 0 until menu.size()) {
                    val menuItem = menu.getItem(i)
                    menuItems.add(
                        GlassMenuItem(
                            menuItem.itemId, menuItem.icon,
                            menuItem.title.toString()
                        )
                    )
                    adapter.notifyDataSetChanged()
                }
            }
            return super.onCreateOptionsMenu(menu)
        }
        

    জাভা

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
          final int menuResource = getIntent()
              .getIntExtra(EXTRA_MENU_KEY, EXTRA_MENU_ITEM_DEFAULT_VALUE);
          if (menuResource != EXTRA_MENU_ITEM_DEFAULT_VALUE) {
            final MenuInflater inflater = getMenuInflater();
            inflater.inflate(menuResource, menu);
    
            for (int i = 0; i < menu.size(); i++) {
              final MenuItem menuItem = menu.getItem(i);
              menuItems.add(
                  new GlassMenuItem(menuItem.getItemId(), menuItem.getIcon(),
                      menuItem.getTitle().toString()));
              adapter.notifyDataSetChanged();
            }
          }
          return super.onCreateOptionsMenu(menu);
        }
        
  4. কোন বিকল্পটি নির্বাচন করা হয়েছে তা নির্ধারণ করতে LayoutManager এবং SnapHelper এর সাথে একসাথে OnScrollListener ব্যবহার করুন।
  5. মেনু আইটেম নির্বাচন ইভেন্ট পরিচালনা করার জন্য একটি TAP অঙ্গভঙ্গি শুনুন।
  6. নির্বাচিত মেনু আইটেম সম্পর্কে তথ্য সহ একটি Intent তৈরি করুন।
  7. এই কার্যকলাপের জন্য একটি ফলাফল সেট করুন এবং এটি শেষ করুন।
  8. আপনি যেখানে একটি মেনু রাখতে চান সেই অংশ বা কার্যকলাপ থেকে startActivityForResult কল করুন। এই উদ্দেশ্যে একটি TAP অঙ্গভঙ্গি ব্যবহার করুন।
  9. নির্বাচিত মেনু আইটেমটি পরিচালনা করতে কলিং ফ্র্যাগমেন্ট বা কার্যকলাপে onActivityResult ওভাররাইড করুন।

নির্দেশিকা

আপনার মেনু লেআউট কীভাবে সেট আপ করবেন তার জন্য নিম্নলিখিত পরামর্শগুলির একটি তালিকা রয়েছে:

নিম্নলিখিত চিত্রটি একটি কাস্টমাইজড মেনু বিন্যাসের একটি উদাহরণ:

এই সাধারণ চিত্রটি একটি কালো ব্যাকগ্রাউন্ড দেখায় যেখানে স্ক্রীনকে কেন্দ্র করে 'মেন্যু লেআউট' শব্দ এবং পাশে একটি ফোন প্রতীক রয়েছে।

বাস্তবায়নের বিশদ বিবরণের জন্য কার্ডের নমুনা অ্যাপটি পর্যালোচনা করুন।

সোয়াইপযোগ্য পৃষ্ঠা

গ্লাস ডিসপ্লে এবং টাচপ্যাড একটি সুবিধাজনক উপায়ে সোয়াইপযোগ্য কার্ড প্রদর্শন করতে একসাথে কাজ করে। আপনি স্ট্যান্ডার্ড অ্যান্ড্রয়েড ViewPager API এর সাথে আপনার কার্যকলাপে সোয়াইপযোগ্য পৃষ্ঠাগুলি তৈরি করতে পারেন।

কার্ড বা স্ক্রিনের মাধ্যমে স্ক্রোল করার জন্য Android ViewPager কীভাবে ব্যবহার করবেন সে সম্পর্কে আরও তথ্যের জন্য স্ক্রীন স্লাইড প্রশিক্ষণ ডকুমেন্টেশন দেখুন।