রোটেশন ব্যবহার করে হরিজন্টাল SeekBar-কে ভার্টিক্যাল করা
অ্যান্ড্রয়েডে নেটিভ ভার্টিক্যাল SeekBar নেই। কিন্তু হরিজন্টাল SeekBar-কে ২৭০ ডিগরি রোটেট করে ভার্টিক্যাল SeekBar হিসেবে ব্যবহার করা যায়। এটি সহজ এবং কার্যকর পদ্ধতি।
ধাপ ১: প্রজেক্ট তৈরি করুন
স্ট্যান্ডার্ড অ্যান্ড্রয়েড প্রজেক্ট।
ধাপ ২: লেআউটে রোটেটেড SeekBar
res/layout/activity_main.xml - `android:rotation="270"` ব্যবহার করুন:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<SeekBar
android:id="@+id/seekBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:rotation="270" />
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:text=""
android:textSize="16sp" />
</RelativeLayout>
ধাপ ৩: SeekBar লজিক
src/MainActivity.java:
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.SeekBar;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
SeekBar seekBar;
TextView textView;
int min = 0, max = 100, current = 50;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.textView);
seekBar = findViewById(R.id.seekBar);
// ম্যাক্স এবং কারেন্ট ভ্যালু সেট করুন
seekBar.setMax(max - min); // ১০০
seekBar.setProgress(current - min); // ৫০
textView.setText(String.valueOf(current));
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
current = progress + min;
textView.setText(String.valueOf(current));
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// টাচ শুরু হলে
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// টাচ শেষ হলে
}
});
}
}
গুরুত্বপূর্ণ বিবেচনা
- রোটেশন ২৭০°: ঘড়ির ডিকের দিকে ৯০° বা বামে ২৭০° - দুটোই কাজ করে
- লেআউট হাইট/উইডথ: রোটেশনের কারণে `layout_width="match_parent"` ভার্টিক্যাল হাইট বানায়
- প্যাডিং/মার্জিন: রোটেশনের কারণে প্যাডিং/মার্জিন আচরণ ভিন্ন হতে পারে, টেস্ট করুন
- টাচ ইভেন্ট: রোটেশন টাচ কোঅর্ডিনেট প্রভাবিত করে না, নরমাল কাজ করে
বিকল্প পদ্ধতি: কাস্টম ভিউ (আধুনিক)
আধুনিক অ্যাপের জন্য কাস্টম `VerticalSeekBar` ক্লাস তৈরি করুন:
public class VerticalSeekBar extends AppCompatSeekBar {
public VerticalSeekBar(Context context) { super(context); }
public VerticalSeekBar(Context context, AttributeSet attrs) { super(context, attrs); }
public VerticalSeekBar(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); }
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(h, w, oldh, oldw); // সোয়াপ
}
@Override
protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(heightMeasureSpec, widthMeasureSpec);
setMeasuredDimension(getMeasuredHeight(), getMeasuredWidth());
}
@Override
protected void onDraw(Canvas c) {
c.rotate(-90);
c.translate(-getHeight(), 0);
super.onDraw(c);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// টাচ কোঅর্ডিনেট রোটেট করুন
return super.onTouchEvent(event);
}
}
Material Slider (Material Components)
Material Design লাইব্রেরি ব্যবহার করলে:
<com.google.android.material.slider.Slider
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:valueFrom="0"
android:valueTo="100"
android:value="50" />