Я пытаюсь реализовать пользовательский вид внутри родителя HorizontalScrollView. Пользовательский вид неоднократно рисует линию на холсте на основе хронометража из обработчика. Прямо сейчас пользовательский вид заполняет ширину экрана (ограничен высотой 548 точек на дюйм), и я хочу, чтобы линия могла выходить за пределы видимого. Кроме того, я хочу, чтобы пользователь мог горизонтально прокручивать, чтобы увидеть больше строки. Я попытался установить ширину HorizontalScrollView на 1500dp (что намного больше ширины экрана), а затем я попытался прокрутить по горизонтали, но он не двигался. Было бы также идеально, если бы вид прокручивался по линии, когда она пробивалась сквозь видимую часть экрана.Реализация динамического HorizontalScrollView с настраиваемым представлением дочернего объекта
Я разрабатываю трансформатор ASUS с сотовым устройством.
Вот соответствующая часть макета я использую:
<HorizontalScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="1500dp"
android:layout_height="548dp"
android:fillViewport="true" >
<maavapp.layout.CustomDraw
android:id="@+id/custom_draw"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
</maavapp.layout.CustomDraw>
</HorizontalScrollView>
А вот код для класса CustomDraw:
public class CustomDraw extends View {
private static int mSelected;
private ArrayList<Coordinate> measure1;
private ArrayList<Coordinate> measure2;
private ArrayList<Coordinate> measure3;
private boolean north = false, east = true, south = true, west = false;
private DrawHandler dh = new DrawHandler();
private boolean draw = true;
private int width;
private int height;
private int m2;
public CustomDraw(Context context) {
super(context);
init();
}
public CustomDraw(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public CustomDraw(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
public void init() {
measure1 = new ArrayList<Coordinate>();
measure2 = new ArrayList<Coordinate>();
measure3 = new ArrayList<Coordinate>();
mSelected = Constants.MEASURE_1;
width = 0;
height = 0;
m2 = 0;
}
public void setMeasure(int measure) {
mSelected = measure;
}
public void toggleDraw() {
draw = !draw;
if(draw) {
updateLine();
}
}
public boolean isDrawing() {
return draw;
}
public void updateLine() {
// grab new coordinates for each measure
/*new_coord(measure1);
new_coord(measure2);
new_coord(measure3);*/
if(measure1.isEmpty() && measure2.isEmpty() && measure3.isEmpty()) {
measure1.add(new Coordinate(0, 0));
measure2.add(new Coordinate(0, 0));
measure3.add(new Coordinate(0, 0));
} else {
Coordinate last_coord = measure1.get(measure1.size() - 1);
measure2.add(new Coordinate(++m2, 25));
/*if(last_coord.x >= width) {
east = false;
west = true;
} else if(last_coord.x <= 0) {
east = true;
west = false;
}*/
if(last_coord.y >= height) {
south = false;
north = true;
} else if(last_coord.y <= 0) {
south = true;
north = false;
}
Log.d("MAAV", "last_coord.x + 3: " + (last_coord.x + 3));
Log.d("MAAV", "last_coord.y + 3: " + (last_coord.y + 3));
if(south && east) {
measure1.add(new Coordinate(last_coord.x + 3, last_coord.y + 3));
} else if(south && west) {
measure1.add(new Coordinate(last_coord.x - 3, last_coord.y + 3));
} else if(north && east) {
measure1.add(new Coordinate(last_coord.x + 3, last_coord.y - 3));
} else if(north && west) {
measure1.add(new Coordinate(last_coord.x - 3, last_coord.y - 3));
}
}
if(draw) {
dh.sleep(10);
}
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
this.width = w;
this.height = h;
super.onSizeChanged(w, h, oldw, oldh);
}
@Override
public void onDraw(Canvas c) {
super.onDraw(c);
Paint p = new Paint();
p.setStyle(Paint.Style.FILL);
p.setColor(Color.WHITE);
c.drawPaint(p);
p.setColor(Color.BLACK);
switch(mSelected) {
case Constants.MEASURE_1:
for(int i = 0; i < measure1.size(); i++) {
Coordinate coord = measure1.get(i);
Log.d("MAAV", "drawing coord.x, coord.y: " + (coord.x) + ", " + (coord.y));
c.drawRect(coord.x, coord.y, coord.x + 3, coord.y + 3, p);
}
break;
case Constants.MEASURE_2:
for(int i = 0; i < measure2.size(); i++) {
Coordinate coord = measure2.get(i);
c.drawRect(coord.x, coord.y, coord.x + 3, coord.y + 3, p);
}
break;
case Constants.MEASURE_3:
for(int i = 0; i < measure2.size(); i++) {
Coordinate coord = measure2.get(i);
c.drawRect(coord.x, coord.y, coord.x + 3, coord.y + 3, p);
}
break;
}
}
class DrawHandler extends Handler {
@Override
public void handleMessage(Message msg) {
CustomDraw.this.updateLine();
CustomDraw.this.invalidate();
}
public void sleep(long delayMillis) {
this.removeMessages(0);
sendMessageDelayed(obtainMessage(0), delayMillis);
}
}
}
Спасибо за любую помощь!
-1 за вопрос такой же вопрос дважды, что тоже с через полчаса ... http: //stackoverflow.com/questions/10214244/horizontal-scroll-view-with-custom-view-child –
Опять же, я объяснил вам, что это другой вопрос. Кроме того, поскольку я принял другой вопрос, я не хотел потерять интерес к новому вопросу, просто отредактировав старый. – jrubins
Спасибо за то, что я непродуктивен и сосредоточен только на том, что я задал подобный вопрос, вместо того, чтобы реально понять, что я прошу о помощи и скорее буду иметь ответ, чем бесполезные комментарии. Я чувствую, что -1 должен быть для вопросов, которые не показывают отсутствие внешних исследований или усилий, которые, я думаю, я сделал. Я хотел бы попросить вас подумать о том, почему вы что-то и как это вносит. – jrubins