2012-01-30 2 views
14

Я использую Горизонтальный вид прокрутки, динамически добавляю в него элементы. если нет. элементов больше, чем отображение элементов на экране. Я хочу показать изображение (стрелка) по краям (например, просмотр прокрутки показывает края затухания). Как мне это сделать.Как установить изображения для ScrollView вместо затухающих ребер?

просто посмотрите ниже изображение, я хочу создать вот так.

это код XML

<HorizontalScrollView 
    android:layout_width="wrap_content" 
    android:scrollbars="none" 
    android:id="@+id/app_category" 
    android:layout_below="@+id/top_layout" 
    android:background="@drawable/minitopbar" 
    android:layout_height="30dp"> 

    <LinearLayout 
    android:orientation="horizontal" 
    android:id="@+id/app_category_scroll_layout" 
    android:layout_width="wrap_content"        
    android:layout_height="fill_parent"/> 

</HorizontalScrollView> 

enter image description here

+0

Добавление изображений средствами? Любое изображение вместо зеленого цвета на краю? или как добавление изображений в линейную компоновку? –

+0

Любое изображение вместо зеленого цвета на краю, если scrollview имеет элементы для прокрутки –

+0

с одинаковой шириной и высотой, равной зеленому цвету? Мое предложение состоит в том, что вы можете удалить цвет затухающих краев, если хотите. –

ответ

19

A. Вы должны создать свой собственный класс, который расширяет HorizontalScrollView:

public class ExtendedHorizontalScrollView extends HorizontalScrollView { 

private IScrollStateListener scrollStateListener; 

public HorizontalScrollViewForMenu(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
} 

public HorizontalScrollViewForMenu(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

public HorizontalScrollViewForMenu(Context context) { 
    super(context); 
} 

@Override 
protected void onLayout(boolean changed, int l, int t, int r, int b) { 
    super.onLayout(changed, l, t, r, b); 
    prepare(); 
} 

private void prepare() { 
    if (scrollStateListener != null) { 
     View content = this.getChildAt(0); 
     if (content.getLeft() >= 0) 
      scrollStateListener.onScrollMostLeft(); 
     if (content.getLeft() < 0) 
      scrollStateListener.onScrollFromMostLeft(); 

     if (content.getRight() <= getWidth()) 
      scrollStateListener.onScrollMostRight(); 
     if (content.getLeft() > getWidth()) 
      scrollStateListener.onScrollFromMostRight(); 
    } 
} 

@Override 
protected void onScrollChanged(int l, int t, int oldl, int oldt) { 
    super.onScrollChanged(l, t, oldl, oldt); 
    if (scrollStateListener != null) { 
     if (l == 0) 
      scrollStateListener.onScrollMostLeft(); 
     else if (oldl == 0) 
      scrollStateListener.onScrollFromMostLeft(); 
     int mostRightL = this.getChildAt(0).getWidth() - getWidth(); 
     if (l >= mostRightL) 
      scrollStateListener.onScrollMostRight(); 
     if (oldl >= mostRightL && l < mostRightL) 
      scrollStateListener.onScrollFromMostRight(); 
    } 
} 

public void setScrollStateListener(IScrollStateListener listener) { 
    scrollStateListener = listener; 
} 

public interface IScrollStateListener { 
    void onScrollMostLeft(); 

    void onScrollFromMostLeft(); 

    void onScrollMostRight(); 

    void onScrollFromMostRight(); 
} 
} 

B. Используйте его определение макета:

<LinearLayout 
     .....> 
    <ImageView 
     android:id="@+id/navigation_left" 
     ..... /> 

    <your.custom.view.package.ExtendedHorizontalScrollView 
     android:id="@+id/scroller" 
     android:layout_width="0px" 
     android:layout_weight="1" 
     android:fadingEdge="none" 
       ....> 
     <LinearLayout 
      android:orientation="horizontal" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" /> 
    </your.custom.view.package.ExtendedHorizontalScrollView> 

    <ImageView 
     android:id="@+id/navigation_right" 
     ..... /> 

</LinearLayout> 

C. Добавьте логику для отключения стрелок, когда вы больше не можете прокручивать.

((ExtendedHorizontalScrollView)findViewById(R.id.scroller)).setScrollStateListener(new IScrollStateListener() { 
     public void onScrollMostRight() { 
      ((View) scroller.getParent()).findViewById(R.id.navigation_right).setVisibility(View.INVISIBLE); 
     } 

     public void onScrollMostLeft() { 
      ((View) scroller.getParent()).findViewById(R.id.navigation_left).setVisibility(View.INVISIBLE); 
     } 

     public void onScrollFromMostLeft() { 
      ((View) scroller.getParent()).findViewById(R.id.navigation_left).setVisibility(View.VISIBLE); 
     } 

     public void onScrollFromMostRight() { 
      ((View) scroller.getParent()).findViewById(R.id.navigation_right).setVisibility(View.VISIBLE); 
     } 

    }); 
+0

Я использую пользовательский вариант горизонтального списка вместо просмотра прокрутки .. это подходит для этого .. –

+0

Да, просто переопределите 'onScrollChanged' вашего списка просмотреть и посмотреть, можно ли прокручивать больше - если да - показать стрелки – Jin35

+0

Используется, потому что 'ScrollView' не позволяет много детей. Если вы используете 'ListView' - вам это не нужно – Jin35

1

простой альтернативой является сделать Scrollview без выцветания краев, а затем добавить изображение со стрелкой внизу или вверху Scrollview.

Ваш XML-то подобное:

<FrameLayout 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"> 
     <ListView 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:layout_alignParentTop="true" 
      android:fadingEdge="none" 
     /> 
     <RelativeLayout 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent"> 
      <View 
       android:layout_height="6dp" 
       android:layout_width="fill_parent" 
       android:layout_alignParentBottom="true" 
       android:background="@drawable/background_effect"/> 
     </RelativeLayout> 
    </FrameLayout>