波纹效果不会超出 ImageView
Posted
技术标签:
【中文标题】波纹效果不会超出 ImageView【英文标题】:Ripple effect is not going above the ImageView 【发布时间】:2016-06-02 06:31:49 【问题描述】:我有一个CustomListView
,我在其中显示一些文本并使用Picasso
的库显示一个image
。我在drawable文件夹中创建了一个xml
文件,并为Ripple Effect
创建了drawable-21文件夹,但由于某种原因,效果没有超过ImageView
。
这是我的文件:
drawable
:
listview_item_background.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<solid
android:color="#ffdadada"/>
</shape>
</item>
<item>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<solid
android:color="#ffffff"/>
</shape>
</item>
</selector>
drawable-v21
:
listview_item_background.xml
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="#ffdadada">
<item android:drawable="@android:color/white"/>
</ripple>
activity_main
:
<?xml version="1.0"?>
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_
tools:context=".MainActivity">
<android.support.design.widget.AppBarLayout
android:id="@+id/app_bar_layout"
android:layout_
android:layout_
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
<android.support.design.widget.CollapsingToolbarLayout
android:id="@+id/collapsing_toolbar"
android:layout_
android:layout_
app:layout_scrollFlags="scroll|exitUntilCollapsed"
app:expandedTitleMarginStart="20dp"
app:expandedTitleMarginEnd="20dp"
app:contentScrim="@color/colorPrimary"
android:background="@color/colorPrimary">
<LinearLayout
android:layout_
android:layout_
android:gravity="start|bottom"
app:layout_collapseMode="parallax"
android:background="@color/colorPrimary"
android:orientation="vertical">
...
</LinearLayout>
<android.support.v7.widget.Toolbar
android:layout_
android:layout_
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
app:layout_collapseMode="pin"
app:theme="@style/ToolbarTheme"
android:background="@android:color/transparent"
android:id="@+id/main_toolbar">
<TextView
android:layout_
android:layout_
android:layout_gravity="start"
android:id="@+id/toolbar_title"
android:textSize="20sp"
android:textColor="#ffffff"/>
</android.support.v7.widget.Toolbar>
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<android.support.v4.widget.NestedScrollView
android:id="@+id/scroll"
android:layout_
android:layout_
android:clipToPadding="false"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
android:background="#eeeeee">
<FrameLayout
android:layout_
android:layout_>
<LinearLayout
android:layout_
android:layout_
android:orientation="vertical"
tools:ignore="UselessParent">
<packagename.NestedListView
android:id="@android:id/list"
android:layout_
android:layout_
android:layout_marginTop="4dp"
android:divider="#eeeeee"
android:drawSelectorOnTop="true"/>
</LinearLayout>
</FrameLayout>
</android.support.v4.widget.NestedScrollView>
</android.support.design.widget.CoordinatorLayout>
NestedListView
:
public class NestedListView extends ListView implements View.OnTouchListener, AbsListView.OnScrollListener
private int listViewTouchAction;
private static final int MAXIMUM_LIST_ITEMS_VIEWABLE = 99;
public NestedListView(Context context, AttributeSet attrs)
super(context, attrs);
listViewTouchAction = -1;
setOnScrollListener(this);
setOnTouchListener(this);
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount)
if (getAdapter() != null && getAdapter().getCount() > MAXIMUM_LIST_ITEMS_VIEWABLE)
if (listViewTouchAction == MotionEvent.ACTION_MOVE)
scrollBy(0, -1);
@Override
public void onScrollStateChanged(AbsListView view, int scrollState)
@SuppressLint("DrawAllocation")
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int newHeight = 0;
final int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
if (heightMode != MeasureSpec.EXACTLY)
ListAdapter listAdapter = getAdapter();
if (listAdapter != null && !listAdapter.isEmpty())
int listPosition;
for (listPosition = 0; listPosition < listAdapter.getCount()
&& listPosition < MAXIMUM_LIST_ITEMS_VIEWABLE; listPosition++)
View listItem = listAdapter.getView(listPosition, null, this);
//now it will not throw a NPE if listItem is a ViewGroup instance
if (listItem instanceof ViewGroup)
listItem.setLayoutParams(new LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
listItem.measure(widthMeasureSpec, heightMeasureSpec);
newHeight += listItem.getMeasuredHeight();
newHeight += getDividerHeight() * listPosition;
if ((heightMode == View.MeasureSpec.AT_MOST) && (newHeight > heightSize))
if (newHeight > heightSize)
newHeight = heightSize;
else
newHeight = getMeasuredHeight();
setMeasuredDimension(getMeasuredWidth(), newHeight);
@Override
public boolean onTouch(View v, MotionEvent event)
if (getAdapter() != null && getAdapter().getCount() > MAXIMUM_LIST_ITEMS_VIEWABLE)
if (listViewTouchAction == MotionEvent.ACTION_MOVE)
scrollBy(0, 1);
return false;
MainActivity
:
NestedListView list = (NestedListView)findViewById(android.R.id.list);
CustomList adapter = new CustomList(MainActivity.this, myRssFeed.getList());
adapter.addAll();
list.setAdapter(adapter);
custom_listview_item
:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_>
<android.support.v7.widget.CardView
android:id="@+id/card_view"
android:layout_
android:layout_
app:cardCornerRadius="2dp"
app:cardElevation="2dp"
android:layout_marginBottom="@dimen/cardMarginVertical"
android:layout_marginLeft="@dimen/cardMarginHorizontal"
android:layout_marginRight="@dimen/cardMarginHorizontal"
android:layout_marginTop="@dimen/cardMarginVertical"
app:cardPreventCornerOverlap="false"
app:contentPadding="0dp">
<LinearLayout
android:layout_
android:layout_
android:orientation="vertical"
android:background="@drawable/listview_item_background"
android:id="@+id/ln">
<ImageView
android:layout_
android:layout_
android:background="#d6d6d6"
android:contentDescription="@null"
android:id="@+id/image"
android:scaleType="centerCrop" />
<TextView
android:layout_
android:layout_
android:paddingRight="16dp"
android:paddingLeft="16dp"
android:layout_marginBottom="8dp"
android:textSize="18sp"
android:fontFamily="sans-serif"
tools:ignore="HardcodedText,UnusedAttribute"
android:id="@+id/title"/>
<Button
android:layout_
android:layout_
android:layout_marginTop="16dp"
android:paddingEnd="6dp"
android:paddingRight="6dp"
android:background="@drawable/listview_item_background"
android:text="@string/condividi"
android:textStyle="bold"
android:textSize="16sp"
android:textColor="@color/material_text_dialogs"
android:gravity="center|center_vertical|center_horizontal"
android:stateListAnimator="@null"
tools:ignore="RtlHardcoded,RtlSymmetry,UnusedAttribute"
android:id="@+id/condividi"/>
</LinearLayout>
</android.support.v7.widget.CardView>
</FrameLayout>
CustomList
类:
public class CustomList extends ArrayAdapter<RSSItem>
private static Activity context = null;
private final List<RSSItem> web;
public CustomList(Activity context, List<RSSItem> web)
super(context, R.layout.new_listview, web);
CustomList.context = context;
this.web = web;
@Override
public View getView(final int position, View view, ViewGroup parent)
LayoutInflater inflater = context.getLayoutInflater();
@SuppressLint("ViewHolder", "InflateParams") final View rowView = inflater.inflate(R.layout.new_listview, null, true);
ImageView imageView = (ImageView)rowView.findViewById(R.id.image);
Picasso.with(context).load(web.get(position).getImage()).into(imageView);
TextView textView = (TextView)rowView.findViewById(R.id.title);
textView.setText(html.fromHtml(web.get(position).getTitle()));
LinearLayout linearLayout = (LinearLayout)rowView.findViewById(R.id.notizia);
linearLayout.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
String url = web.get(position).getLink();
if (!url.startsWith("http://") && !url.startsWith("https://"))
url = "http://" + url;
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
String title = "Completa azione usando:";
Intent chooser = Intent.createChooser(browserIntent, title);
context.startActivity(chooser);
);
Button button = (Button)rowView.findViewById(R.id.condividi);
button.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
);
return rowView;
这就是我显示 ImageView 的方式。
你能帮帮我吗?
【问题讨论】:
点击LinearLayout时imageview是否获得焦点 不,涟漪效果只是在图像下方,但如果我单击一个图像,我会看到涟漪效果在 LinearLayout 的其余部分(我有 TextView)上扩展 请发布您的适配器代码。 @Mussa 检查编辑 【参考方案1】:我设法在没有额外布局的情况下解决了这个问题。:
<CardView ...>
<RelativeLayout
...
android:clickable="true"
android:focusable="true"
android:foreground="?attr/selectableItemBackground">
<ImageView .../>
</RelativeLayout>
</CardView>
【讨论】:
【参考方案2】:几天前我也面临同样的问题。我通过将ImageView
包装在FrameLayout
中并在FrameLayout 上应用android:foreground
属性解决了我的问题。您还必须将FrameLayout
的android:clickable
属性设置为true
,或者应将onClickListener
设置为FrameLayout
。
请在link的后续帖子中查看我的答案。
如果有帮助,请告诉我。
【讨论】:
我这样做了:以上是关于波纹效果不会超出 ImageView的主要内容,如果未能解决你的问题,请参考以下文章
android 5.0 默认水波纹背景属性,可设置不论什么View