Tôi đang cố gắng tìm một thanh tìm kiếm thẳng đứng với trình mô phỏng, nhưng tôi là loại bị kẹt. Tôi có thể lấy thanh tìm kiếm để hiển thị theo cách tôi muốn, và tôi có thể đạt được tiến bộ để làm những gì tôi muốn và tôi có thể sửa đổi onTouchEvent để nhận ngón tay cái theo chiều dọc thay vì theo chiều ngang. Những gì tôi không thể làm là lấy ngón tay cái để di chuyển bên ngoài của mặc định 29 pixel ngang mà không cần sử dụng setThumbOffset(). Điều này trong chính bản thân số không phải là vấn đề. Vấn đề là đến từ thực tế là tôi không hiểu thumbOffset ở tất cả - tôi đoán. Tôi nghĩ rằng tôi có thể (đúng cách) thay đổi kích thước các phụ tùng , mà tôi khá chắc chắn tôi không làm đúng. Hoặc có thể tôi có thể chỉ cần sử dụng thumbOffset nếu tôi có thể tìm ra. Vì tôi có thể tính toán tiến độ chính xác, tôi nghĩ tôi sẽ chỉ sử dụng hàm tuyến tính tuyến tính * (getTop() - getBottom()) của tiện ích con nhưng dường như không làm điều đó. Nhưng tôi không thể tìm ra bù đắp là tập trung xung quanh.Sửa đổi tiện ích con thanh tìm kiếm Android để hoạt động theo chiều dọc
Là một phần hơi sang một bên, tôi thực sự không chắc chắn nếu những gì tôi đang làm trong onSizeChanged() là lành mạnh hoặc nếu nó sẽ cắn tôi trong ass sau này trên.
Dưới đây là cách bố trí main.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<com.mobilsemantic.mobipoll.SlideBar
android:id="@+id/slide"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:max="100"
android:progress="0"
android:secondaryProgress="25" />
<Button android:id="@+id/button"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="Hello, I am a Button" />
<TextView android:id="@+id/tracking"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
</LinearLayout>
Và lớp (bỏ qua các tin rác gỡ lỗi):
import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.SeekBar;
public class SlideBar extends SeekBar {
private int oHeight = 320, oWidth = 29;
private int oProgress = -1, oOffset = -1;;
private float xPos = -1, yPos = -1;
private int top = -1, bottom = -1, left = -1, right = -1;
public SlideBar(Context context) {
super(context);
}
public SlideBar(Context context, AttributeSet attrs)
{
super(context, attrs);
oOffset = this.getThumbOffset();
oProgress = this.getProgress();
}
public SlideBar(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
}
protected synchronized void onMeasure(int widthMeasureSpec, intheightMeasureSpec)
{
int height = View.MeasureSpec.getSize(heightMeasureSpec);
oHeight = height;
this.setMeasuredDimension(oWidth, oHeight);
}
protected void onSizeChanged(int w, int h, int oldw, int oldh)
{
super.onSizeChanged(h, w, oldw, oldh);
}
protected void onLayout(boolean changed, int l, int t, int r, int b)
{
super.onLayout(changed, l, t, r, b);
left = l;
right = r;
top = t;
bottom = b;
}
protected void onDraw(Canvas c)
{
c.rotate(90);
c.translate(0,-29);
super.onDraw(c);
}
public boolean onTouchEvent(MotionEvent event)
{
xPos = event.getX();
yPos = event.getY();
float progress = (yPos-this.getTop())/(this.getBottom()-this.getTop());
oOffset = this.getThumbOffset();
oProgress = this.getProgress();
Log.d("offset" + System.nanoTime(), new Integer(oOffset).toString());
Log.d("progress" + System.nanoTime(), new Integer(oProgress).toString());
float offset;
offset = progress * (this.getBottom()-this.getTop());
this.setThumbOffset((int)offset);
Log.d("offset_postsetprogress" + System.nanoTime(), new Integer(oOffset).toString());
Log.d("progress_postsetprogress" + System.nanoTime(), new Integer(oProgress).toString());
this.setProgress((int)(100*event.getY()/this.getBottom()));
return true;
}
}
phải xem http://stackoverflow.com/a/28397583/3496570 và http://stackoverflow.com/a/28397530/ 3496570 – Nepster