Ich verwende ein benutzerdefiniertes Snapping ScrollView in meiner App. Es erweitert HorizontalScrollView und überschreibt onTouchEvent(). Dies wird verwendet, um die untergeordneten Ansichten in der Mitte der ScrollView einzufangen. Es gibt auch einen führenden und einen nachgestellten Raum, die breit genug sind, damit das erste und das letzte Element in der Mitte platziert werden können.
ich zwei Klassenvariablen:Wie ändert man die Eigenschaften von Ansichten innerhalb von ScrollView während des Scrollens und ausgelöst durch Scrollen?
int mActiveFeature //Position of the element nearest to the middle, initially set to 1
List<Integer> mAvailableItems //IDs of contained menu elements in order without the spaces
ist hier mein onTouchEvent:
@Override
public boolean onTouchEvent(MotionEvent event) {
final int menuItemCount = this.mAvailableItems.size();
switch(event.getAction()) {
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
float scrollX = getScrollX();
float layoutWidth =
SnappingScroll.this.getWidth();
float featureWidth =
(int) getResources().getDimension(R.dimen.item_width);
float spaceWidth =
(int) getResources().getDimension(R.dimen.space_width);
View oldItem =
findViewById(
SnappingScroll.this.mAvailableItems.get(
SnappingScroll.this.mActiveFeature - 1
)
);
oldItem.setAlpha(0.5f);
oldItem.setClickable(false);
SnappingScroll.this.mActiveFeature = (int) Math.min(
Math.round((scrollX - spaceWidth + (layoutWidth/2) + (featureWidth/2))/featureWidth),
(float) menuItemCount
);
View newItem =
findViewById(
SnappingScroll.this.mAvailableItems.get(
SnappingScroll.this.mActiveFeature - 1
)
);
newItem.setAlpha(1.0f);
newItem.setClickable(true);
int scrollTo = (int) (
SnappingScroll.this.mActiveFeature * featureWidth
+ spaceWidth
- layoutWidth/2
- featureWidth/2
);
smoothScrollTo(scrollTo, 0);
return true;
default:
return super.onTouchEvent(event);
}
}
Hier ist die XML-Datei, die ich
bin mit wollen<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/black"
android:orientation="vertical">
<com.example.SnappingScroll
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_horizontal">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center_vertical">
<Space
android:id="@+id/leading_space"
android:layout_width="@dimen/space_width"
android:layout_height="match_parent" />
<ImageView
android:id="@+id/item_1"
android:layout_width="@dimen/item_width"
android:layout_height="match_parent"
android:alpha="0.5"
android:clickable="false"
android:onClick="clickFunction"
android:src="@drawable/m_1"/>
<ImageView
android:id="@+id/item_2"
android:layout_width="@dimen/item_width"
android:layout_height="match_parent"
android:alpha="0.5"
android:clickable="false"
android:onClick="clickFunction"
android:src="@drawable/m_2"/>
<ImageView
android:id="@+id/item_3"
android:layout_width="@dimen/item_width"
android:layout_height="match_parent"
android:alpha="0.5"
android:clickable="false"
android:onClick="clickFunction"
android:src="@drawable/m_3"/>
<Space
android:id="@+id/trailing_space"
android:layout_width="@dimen/space_width"
android:layout_height="match_parent" />
</LinearLayout>
</com.example.SnappingScroll>
</LinearLayout>
ich alle Elemente auf halbtransparent und nicht anklickbar, außer der aktiven Funktion. Im Moment können Sie blättern, und wenn Sie loslassen, rastet die Ansicht am nächsten Element ein. Dann ist das zuletzt eingerastete Element deaktiviert und das neue Element ist aktiviert aktiviert. Das funktioniert gut, aber ich möchte, dass der Benutzer sieht, an welchem Element die ScrollView-Funktion aktiviert wird, wenn er den Finger hebt. Daher sollten die Berechnungen für die neue aktive Funktion und die Änderung der Transparenz während des Scrollens durchgeführt werden. Ist das möglich? Ich habe bereits versucht, den Code in einen Fall für MotionEvent.ACTION_MOVE zu schreiben, aber dann scrollte die Ansicht überhaupt nicht. Als ich den Code in einen Fall für MotionEvent.ACTION_SCROLL legte, passierte nichts und das Fangen wurde nicht ausgelöst.
Edit:
Zuerst habe ich den Code in einem zusätzlichen OnTouchListener, die überflüssig war, so dass ich jetzt die onTouchEvent Funktion außer Kraft setzen und bearbeiten entsprechend die Frage.