-1

Я пытаюсь реализовать пользовательский вид внутри родителя 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); 
    } 
} 
} 

Спасибо за любую помощь!

+0

-1 за вопрос такой же вопрос дважды, что тоже с через полчаса ... http: //stackoverflow.com/questions/10214244/horizontal-scroll-view-with-custom-view-child –

+0

Опять же, я объяснил вам, что это другой вопрос. Кроме того, поскольку я принял другой вопрос, я не хотел потерять интерес к новому вопросу, просто отредактировав старый. – jrubins

+0

Спасибо за то, что я непродуктивен и сосредоточен только на том, что я задал подобный вопрос, вместо того, чтобы реально понять, что я прошу о помощи и скорее буду иметь ответ, чем бесполезные комментарии. Я чувствую, что -1 должен быть для вопросов, которые не показывают отсутствие внешних исследований или усилий, которые, я думаю, я сделал. Я хотел бы попросить вас подумать о том, почему вы что-то и как это вносит. – jrubins

ответ

0

Для всех, кому это любопытно, я выяснил ответ для моей ситуации. Надеюсь, то, что я изложил ниже, может быть вам полезно.

Чтобы получить пользовательский вид для прокрутки, мне пришлось добавить оболочку LinearLayout вокруг моего пользовательского представления. Почему 100% не уверены.

Кроме того, хотя я объявляю фиксированный размер для моего пользовательского вида (в файле XML ниже), я могу обновить его динамически в моем коде с помощью:

CustomDraw.this.setLayoutParams(new LinearLayout.LayoutParams(width + {adjust size}, height)); 

где «ширина» и " height "- это ширина и высота пользовательского вида. Опять же, не уверен, почему я должен сказать «новый LinearLayout.LayoutParams (...);» но это то, что, похоже, работает.

Вот XML я использую:

<HorizontalScrollView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/scroller" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:fillViewport="true" > 

    <LinearLayout 
     android:layout_width="wrap_content" 
     android:layout_height="548dp" 
     android:orientation="vertical" > 

     <maavapp.layout.CustomDraw 
      android:id="@+id/custom_draw" 
      android:layout_width="4800dp" 
      android:layout_height="fill_parent" > 
     </maavapp.layout.CustomDraw> 
    </LinearLayout> 
</HorizontalScrollView> 

А вот соответствующие части кода пользовательского класса Я использую:

public class CustomDraw extends View { 
// member variables 

public void setHSV(HorizontalScrollView hsv) { 
    this.hsv = hsv; 
} 

public void updateLine() { 
    if(measure1.isEmpty()) { 
     measure1.add(new Coordinate(0, 0)); 
    } else { 
     Coordinate last_coord = measure1.get(measure1.size() - 1); 

        // calculate south, north, east, and west 

     if(((last_coord.x + 3) % 1200 == 0) 
       || ((last_coord.x + 3) % 1200 == 1) 
       || ((last_coord.x + 3) % 1200 == 2) 
       || ((last_coord.x + 3) % 1200 == 3) && (last_coord.x + 3 >= 1200)) { 
      hsv.smoothScrollTo(last_coord.x - 50, 0); 
     } 
     if(last_coord.x >= (width - 100)) { 
      this.setLayoutParams(new LinearLayout.LayoutParams(width + 4800, height)); 
      width += 4800; 
     } 

     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); 

     Coordinate coord; 
    for(int i = 0; i < measure1.size(); i++) { 
     coord = measure1.get(i); 
     c.drawRect(coord.x, coord.y, coord.x + 3, coord.y + 3, p); 
    } 
} 

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); 
    } 
} 
}