بروز خطا
[message]
اشتراک در سوال
رای ها
[dataList]
SeekBar سفارشی زیبا (آموزش)
سلام
بعد از آموزش پروگرس بار سفارشی طبق قولی که بهتون دادم قراره امروز آموزش ساخت SeekBar سفارشی رو یادتون بدم امیدوارم که خوشتون بیاد.
کدها خیلی واضح هستش پس نیازی به توضیح نیست در پست آخر هم سورس برنامه رو قرار میدم فقط اگه سوالی داشتید به صورت نظر درج کنید.
با تشکر
این عکس برای یکی از برنامه های که ساختم هستش قراره فقط قسمت SeekBar رو آموزش بدم
+1
0
خیلی عالیه ولی برای من یه جاهاییش مبهمه
من seekbar رو بلدم ولی در حد خیلی ساده این خیلی خوشکله ..
حتما سعی میکنم یاد بگیرم خیلی ممنون . موفق باشید
در ضمن برنامتون هم عالیه تبریک میگم. (7 سال پیش)
+1
0
خیلی ممنون.در مورد مبهم بودن کدها حق با شماست بعضی موقع تویه برنامه یه مشکلی ناخواسته ای پیش میاد که مجبورید برای درست کردن اون از کدهای پیچیده استفاده کنید.مثلا تویه این برنامه یه مشکلی پیش اومد برام اونم این بود که اگه کاربر دستش رو میذاشت روی سیک بار و دستش رو حرکت میداد به بیرون صفحه ی برای برنامه مشکل پیش میومد برای این مشکل مجبور بودم یه کد ها و محاسبات پیچیده ی دیگه ای رو تویه برنامه پیاده کنم و.. برای همین کدهای پیچیده میشن باز هر جاش رو که متوجه نشدید بپرسید . یه پیشنهاد دارم براتون من خودم وقتی که یه کاستون کنترل سفارشی میبینم سعی میکنم خودم بسازمش به جای اینکه برم سراغ سورس کد یا کتابخونه به شما پیشنهاد میکنم خودتون سعی کنید یه سیک بار سفارشی برای خودتون بسازید این طوری برنامتون با بقیه برنامه ها فرق میکنه و کاربر پسندتر میشه. خیلی زیاد حرف زدم ببخشید. (7 سال پیش)
+1
0
خواهش میکنم. من مبتدیم ولی شما خیلی سطحتون بالالتر از من هست و درحد استاد من هستید پس باید زیاد حرف بزنید که من متوجه شم شما راحت باشید .خیلی ممنون بابت توجه ..
کلا من با این کاستوما یخورده مشکل دارم و در این حد بلدم که یه اداپتر بسازم مثلا برای spinner یا toast . این کلاس کاستوم یخورده مبهمه که وقت بذارم براش حتما متوجه میشم
سورسو دانلود کردم مشکلم حل میشه . ممنون از لطفتون و اموزشتون .. عالیه .. موفق باشید. (7 سال پیش)
+2
0
من خودمم مبتدی هستم تازه یک سال هستش که با این سایت آشنا شدم . شما هم کمی وقت بذارید رویه کاستوم کنترل ها از من بهتر میتونید از اینا درست کنید. (7 سال پیش)
+2
0
@ FSR : بسیار عالی و زیباست . @ sana ebadi : روی کاستوم کنترل زیاد وقت بذارید برای یاد گرفتنش . مسلط که بشید کارهای عجیب و غریبی میشه باهاش درست کرد ( تقریبا هر کاری ). (7 سال پیش)
+1
0
برای اینکه بدونید با کاستوم کنترل ها چه کارای میشه انجام داد بهتون پیشنهاد میکنم برنامه ی اکسیر سبز رو دانلود کنید. لینک (7 سال پیش)
+2
0
ممنون از توجهتون بچه ها ، پس حتما روش وقت میذارم و این برنامه رو دانلود میکنم . مرسی از شما (7 سال پیش)
برای این سوال 2 پاسخ وجود دارد.
پاسخ به سوال
FSR
7 سال پیش
+2
0
کلاس CustomSeekBar :
public class CustomSeekBar extends ImageView {
Paint paintLine1;
Paint paintLine2;
Paint paintLine3;
Paint paintCircle;
Paint paintCircle2;
Paint paintText;
float move = 100;
float x = 100;
private int width = 0;
private int heigth = 0;
float left = 0;
float rigth = 0;
int percent = 0;
int seekBar = 23;
private boolean isCheckt = true;
private String vahed = "Dip";
int min = 0;
int max = 100 - min;
private Typeface font;
public CustomSeekBar(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
font = Typeface.createFromAsset(context.getAssets(), "orange juice.ttf");
intialize();
}
public CustomSeekBar(Context context, AttributeSet attrs) {
super(context, attrs);
font = Typeface.createFromAsset(context.getAssets(), "orange juice.ttf");
intialize();
}
public CustomSeekBar(Context context) {
super(context);
font = Typeface.createFromAsset(context.getAssets(), "orange juice.ttf");
intialize();
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
width = getWidth();
heigth = getHeight();
}
public void setValue(int seekBarValue, int minValue, int maxValue, String vahedValue) {
min = minValue;
max = maxValue - min;
vahed = vahedValue;
if (seekBarValue >= min && seekBarValue <= max) {
seekBar = seekBarValue;
isCheckt = true;
invalidate();
}
}
public void setStart(int seekBarValue, int minValue, int maxValue, String vahedValue) {
min = minValue;
max = maxValue - min;
vahed = vahedValue;
if (seekBarValue >= min && seekBarValue <= max) {
seekBar = seekBarValue;
isCheckt = true;
invalidate();
}
}
public void set(int v) {
seekBar = v;
invalidate();
}
private void intialize() {
paintLine1 = new Paint();
paintLine1.setAntiAlias(true);
paintLine1.setColor(Color.parseColor("#bfbdbb"));
paintLine1.setStyle(Style.FILL);
paintLine2 = new Paint();
paintLine2.setAntiAlias(true);
paintLine2.setColor(Color.parseColor("#ecebeb"));
paintLine2.setStyle(Style.STROKE);
paintLine2.setStrokeWidth(G.convertDpToPixel(1));
paintLine3 = new Paint();
paintLine3.setAntiAlias(true);
paintLine3.setColor(Color.parseColor("#0099cc"));
paintLine3.setStyle(Style.FILL);
paintCircle = new Paint();
paintCircle.setAntiAlias(true);
paintCircle.setColor(Color.parseColor("#d2d0ce"));
paintCircle.setStyle(Style.FILL_AND_STROKE);
paintCircle2 = new Paint();
paintCircle2.setAntiAlias(true);
paintCircle2.setColor(Color.parseColor("#565654"));
paintCircle2.setStyle(Style.STROKE);
paintCircle2.setStrokeWidth(G.convertDpToPixel(1));
paintText = new Paint();
paintText.setAntiAlias(true);
paintText.setColor(Color.parseColor("#ffffff"));
paintText.setStyle(Style.FILL);
paintText.setTextAlign(Align.CENTER);
paintText.setTypeface(font);
//565654
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
float top = heigth / 4;
float bottom = 2 * heigth / 4;
left = 1.5f * top;
rigth = width - (1.5f * top);
float rx = heigth / 6;
float ry = heigth / 6;
float midY = (top + bottom) / 2f;
float textY = 3.5f * heigth / 4;
float x = rigth - left;
if (isCheckt) {
move = (seekBar - min) * x / (max) + left;
isCheckt = false;
}
float moveX = move - left;
percent = (int) Math.round((moveX * max / x) + min);
RectF rectF = new RectF(left, top, rigth, bottom);
RectF rectF2 = new RectF(left, top, move, bottom);
canvas.drawRoundRect(rectF, rx, ry, paintLine1);
canvas.drawRoundRect(rectF2, rx, ry, paintLine3);
canvas.drawRoundRect(rectF, rx, ry, paintLine2);
canvas.drawCircle(move, midY, top, paintCircle);
canvas.drawCircle(move, midY, top, paintCircle2);
paintText.setTextSize(top);
canvas.drawText(percent + " " + vahed, move, textY, paintText);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
move = event.getX();
if (move >= rigth) {
move = rigth;
invalidate();
} else if (move <= left) {
move = left;
invalidate();
} else {
invalidate();
}
break;
case MotionEvent.ACTION_DOWN:
move = event.getX();
if (move >= left && move <= rigth) {
invalidate();
}
break;
}
return true;
}
public int getPercent() {
return percent;
}
}
کلاس G :
public class G extends Application {
public static Context context;
@Override
public void onCreate() {
super.onCreate();
context = getApplicationContext();
}
public static float convertDpToPixel(float dp) {
Resources resources = G.context.getResources();
DisplayMetrics metrics = resources.getDisplayMetrics();
float px = dp * ((float) metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT);
return px;
}
public static float convertPixelsToDp(float px) {
Resources resources = G.context.getResources();
DisplayMetrics metrics = resources.getDisplayMetrics();
float dp = px / ((float) metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT);
return dp;
}
}
کلاس اصلی :
public class Startup extends Activity {
CustomSeekBar cusDialogSize;
TextView txtTest;
Handler handler;
Typeface font;
int size;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
handler = new Handler();
cusDialogSize = (CustomSeekBar) findViewById(R.id.customSeekBar1);
txtTest = (TextView) findViewById(R.id.txtTest);
font = Typeface.createFromAsset(G.context.getAssets(), "Mj_Faraz.TTF");
/*
* 12---> مقدار اولیه سایز
* 8----> min
* 32---> max
* Dp---> text
*/
cusDialogSize.setValue(12, 8, 32, "Dp");
size = cusDialogSize.getPercent();
txtTest.setTypeface(font);
txtTest.setTextSize(12);
cusDialogSize.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
size = cusDialogSize.getPercent();
txtTest.setTextSize(size);
handler.postDelayed(new Runnable() {
public void run() {
txtTest.setTextSize(size);
}
}, 1);
return false;
}
});
}
}
تویه کلاس اصلی توضیح کوتاهی دادم که فقط دونستن این موضوع برای بکار بردن SeekBar داخل برنامه کفایت میکنه ولی بازم اگه جایی از کدهارو متوجه نشدید سوالتون رو به صورت نظر درج کنید تا جواب بدم بهتون.
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .