1. android水波紋是哪個包
Android Ripple Background可以為應用添加漂亮的波紋動畫背景。可以設置波紋的顏色,波浪的速度、一個波紋還是多個波紋。
http://www.mobile-open.com/2014/3388.html
詳細可以參考這個,有圖解教程,希望可以幫到你
2. android 怎麼實現按下顯示不同顏色,又有波紋效果
ripple嵌套selector
<?xmlversion="1.0"encoding="utf-8"?>
<ripplexmlns:android="http://schemas.android.com/apk/res/android"
android:color="#FF0000">
<item>
<selector>
<item
android:drawable="@drawable/icon_pressed"
android:state_pressed="true">
</item>
<item
android:drawable="@drawable/icon_normal"
android:state_pressed="false">
</item>
</selector>
</item>
3. android 自定義控制項怎麼實現動畫效果
Google都幫你實現好了,android 5.0上提供了一個新的屬性android:attr/colorControlHighlight,使用這個屬性定義一個ripple_drawable.xml然後在你需要實現水波紋效果的控制項的地方設置這個xml為背景即可。此屬性支持5.0以上設備,否則會出現應用FC。
4. 如何取消android5.0的水波紋效果
<item android:state_enabled="false">
<shape>
<corners android:radius="2dp"></corners>
<solid android:color="@color/redcolorPressed"></solid>
</shape>
</item>
<item android:state_pressed="true">
<shape>
<corners android:radius="2dp"></corners>
<solid android:color="@color/redcolorPressed"></solid>
5. 如何加入Material Design 波紋效果for Android 5.0
1. MaterialDesignLibrary 在眾多新晉庫中,MaterialDesignLibrary可以說是頗受開發者矚目的一個控制項效果庫,能夠讓開發者在Android 2.2系統上使用Android 5.0才支持的控制項效果,比如扁平、矩形、浮動按鈕,復選框以及各式各樣的進度指示器等。
6. 如何讓所有 View 都可以帶上點擊的水波紋效果
V2EX›Android
如何讓所有 View 都可以帶上點擊的水波紋效果?
AtlantisZ· 2015-11-12 23:49:00 +08:00
這是一個創建於 483 天前的主題,其中的信息可能已經有所發展或是發生改變。
根據 G官方文檔
定製觸摸反饋
材料設計中的觸摸反饋可在用戶與 UI 元素互動時,在接觸點上提供即時視覺確認。適用於按鈕的默認觸摸動畫使用全新 RippleDrawable 類別,以波紋效果實現不同狀態間的轉換。
在大多數情況下,您應以下列方式指定視圖背景,在您的視圖 XML 中應用此功能:
?android:attr/selectableItemBackground 指定有界的波紋
?android:attr/ 指定越界的波紋
注意: 是 API 級別 21 中推出的新屬性。
此外,您可利用 ripple 元素將 RippleDrawable 定義為一個 XML 資源。
您可以為 RippleDrawable 對象指定一種顏色。如果要改變默認觸摸反饋顏色,請使用主題的 android:colorControlHighlight 屬性。
但是發現有時候一個 LinearLayout 設置 android:background="?android:attr/selectableItemBackground"
就帶上了水波紋效果,有的不行,,TextView 也是,設置 android:background="?android:attr/selectableItemBackground"有的帶上了,有的不行.
RecyclerView 的 Item layout 根布局加上了這個屬性也無效果.
後來輾轉反側,找到了 Stackflow 找到的回答,也不奏效.
FrameLayout view = (FrameLayout) View.inflate(context, R.layout.item_top_news, null);
RippleDrawable drawable = (RippleDrawable) mActivity.getResources()
.getDrawable(R.drawable.ripple_background);
view.setClickable(true);
view.setForeground(drawable);
求解如何實現 BiliBili MD 客戶端,幾乎每個 View 點擊都有的水波紋效果.
波紋
attr
Android
drawable
12 回復 |直到 2015-11-19 21:41:40 +08:00
1
little_cup 2015-11-13 00:04:55 +08:00
從設計的角度說,你不應該讓所有的 View 都帶上 Ripple 效果,只應該讓可點擊的元素帶上。
從程序的角度說,你無法讓所有的 View 都帶上 Ripple 效果,只能讓拿到點擊事件的元素帶上。
2
AtlantisZ 2015-11-13 00:15:38 +08:00
@little_cup額,我只是感覺很難有短文字敘述清楚問題,原來標題是如何讓 RecyclerView 的子 Item 帶上水波紋效果了.感覺太局限了.
請問現在 RecyclerView 的子 Item 已經可以響應點擊事件跳轉 Activity 了,請問如何才能帶上水波紋的點擊效果.我在 Item 的 layout 根布局修改 android:background="?android:attr/selectableItemBackground"沒有效果.
3
little_cup 2015-11-13 00:25:24 +08:00
@AtlantisZ哪個 view 綁定 click 就給哪個設 selectableItemBackground 。當然注意不要被其他 view 在視覺上覆蓋了。
4
AtlantisZ 2015-11-13 00:42:01 +08:00
在 onBindViewHolder 中
TypedValue typedValue = new TypedValue();
mActivity.getTheme().resolveAttribute(android.R.attr.selectableItemBackground, typedValue, true);
Drawable background = getResources().getDrawable(typedValue.resourceId);
// Drawable background = getResources().getDrawable(R.drawable.ripple_background);
holder.rootView.setBackground(background);
holder.rootView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(getContext(), VideoDetailActivity.class));
// ToastUtils.showToast(mActivity, "av :: " + mRecommendList.get(position).av);
}
});
還是沒有用額.
5
AtlantisZ 2015-11-13 11:17:22 +08:00
@little_cup
在 onBindViewHolder 中
TypedValue typedValue = new TypedValue();
mActivity.getTheme().resolveAttribute(android.R.attr.selectableItemBackground, typedValue, true);
Drawable background = getResources().getDrawable(typedValue.resourceId);
// Drawable background = getResources().getDrawable(R.drawable.ripple_background);
holder.rootView.setBackground(background);
holder.rootView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(getContext(), VideoDetailActivity.class));
}
});
還是沒有用額.
6
miao1007 2015-11-15 19:55:46 +08:00
這樣寫不會報錯?
ClassNoFound 這個錯誤在低 API 下會出現
7
ybjaychou 2015-11-17 20:53:35 +08:00
我也是在愁這個問題,同樣是在 RecyclerView 的 Item 裡面,不知道怎麼才能有點擊效果,就算不是水紋也可以啊。。
順便搭個車,就是怎麼在 RecyclerView 裡面做多選操作,然後 Toolbar 上面出現操作按鈕,不知道有人做過沒
8
ecma 2015-11-18 19:01:06 +08:00
同表示弄不出波紋點擊效果,不知道是不是 SDK 版本的原因。
目前暫時通過 github 上一個開源項目實現那個效果了。。
https://github.com/balysv/material-ripple
9
ecma 2015-11-18 19:05:55 +08:00
@ybjaychou
我自己是在 itemView 上加入了一個 checkBox ,平常處於隱藏狀態,需要批量刪除的適合,重新載入 RecyclerView 讓 checkBox 顯示。而 checkBox 的點擊事件則是往一個數組裡面扔 item 的 id ,那樣就知道選了那些。
toolbar 的改變的話可以通過 onPrepareOptionsMenu 和 invalidateOptionsMenu()來改變,當然也可以通過 ActionMode.Callback 來實現
通過這種方法來實現的話需要對 checkBox 的點擊進行標示優化,避免列表滑動的適合 checkBox 錯誤問題
10
ybjaychou 2015-11-19 12:52:08 +08:00 via Android
@ecma好,謝謝,我試試!
11
AtlantisZ 2015-11-19 16:49:47 +08:00
@ybjaychou
@ecma
參考http://stackoverflow.com/questions/26961147/touch-feedback-with-recyclerview-and-cardview/29033353解決了 RecyclerView 中 Item 無水波紋效果的問題額.
12
ecma 2015-11-19 21:41:40 +08:00
@AtlantisZ
THX!等下就去試試嘍
7. 如何給Imageview 設置水波紋效果
水波紋效果:
1.標准正餘弦水波紋;
2.非標准圓形液柱水波紋;
雖說都是水波紋,但兩者在實現上差異是比較大的,一個通過正餘弦函數模擬水波紋效果,另外一個會運用到圖像的混合模式(PorterDuffXfermode);
先看效果:
自定義View根據實際情況可以選擇繼承自View、TextView、ImageView或其他
這次的實現我們都選擇繼承view,在實現的過程中我們需要關注如下幾個方法:
1.onMeasure():最先回調,用於控制項的測量;
2.onSizeChanged():在onMeasure後面回調,可以拿到view的寬高等數據,在橫豎屏切換時也會回調;
3.onDraw():真正的繪制部分,繪制的代碼都寫到這裡面;
既然如此,我們先復寫這三個方法,然後來實現如上兩個效果;
一:標准正餘弦水波紋
這種水波紋可以用具體函數模擬出具體的軌跡,所以思路基本如下:
1.確定水波函數方程
2.根據函數方程得出每一個波紋上點的坐標;
3.將水波進行平移,即將水波上的點不斷的移動;
4.不斷的重新繪制,生成動態水波紋;
有了上面的思路,我們一步一步進行實現:
正餘弦函數方程為:
y=Asin(wx+b)+h,這個公式里:w影響周期,A影響振幅,h影響y位置,b為初相;
根據上面的方程選取自己覺得中意的波紋效果,確定對應參數的取值;
然後根據確定好的方程得出所有的方程上y的數值,並將所有y值保存在數組里:
//將周期定為view總寬度
mCycleFactorW=(float)(2*Math.PI/mTotalWidth);
//根據view總寬度得出所有對應的y值
for(inti=0;i<mTotalWidth;i++){
mYPositions[i]=(float)(STRETCH_FACTOR_A*Math.sin(mCycleFactorW*i)+OFFSET_Y);
}
根據得出的所有y值,則可以在onDraw中通過如下代碼繪制兩條靜態波紋:
for(inti=0;i<mTotalWidth;i++){
//減400隻是為了控制波紋繪制的y的在屏幕的位置,大家可以改成一個變數,然後動態改變這個變數,從而形成波紋上升下降效果
//繪制第一條水波紋
canvas.drawLine(i,mTotalHeight-mResetOneYPositions[i]-400,i,
mTotalHeight,
mWavePaint);
//繪制第二條水波紋
canvas.drawLine(i,mTotalHeight-mResetTwoYPositions[i]-400,i,
mTotalHeight,
mWavePaint);
}
這種方式類似於數學裡面的細分法,一條波紋,如果橫向以一個像素點為單位進行細分,則形成view總寬度條直線,並且每條直線的起點和終點我們都能知道,在此基礎上我們只需要循環繪制出所有細分出來的直線(直線都是縱向的),則形成了一條靜態的水波紋;
接下來我們讓水波紋動起來,之前用了一個數組保存了所有的y值點,有兩條水波紋,再利用兩個同樣大小的數組來保存兩條波紋的y值數據,並不斷的去改變這兩個數組中的數據:
privatevoidresetPositonY(){
//mXOneOffset代表當前第一條水波紋要移動的距離
intyOneInterval=mYPositions.length-mXOneOffset;
//使用System.array方式重新填充第一條波紋的數據
System.array(mYPositions,mXOneOffset,mResetOneYPositions,0,yOneInterval);
System.array(mYPositions,0,mResetOneYPositions,yOneInterval,mXOneOffset);
intyTwoInterval=mYPositions.length-mXTwoOffset;
System.array(mYPositions,mXTwoOffset,mResetTwoYPositions,0,
yTwoInterval);
System.array(mYPositions,0,mResetTwoYPositions,yTwoInterval,mXTwoOffset);
}
如此下來只要不斷的改變這兩個數組的數據,然後不斷刷新,即可生成動態水波紋了;
刷新可以調用invalidate()或postInvalidate(),區別在於後者可以在子線程中更新UI
整體代碼如下:
packagecom.csdn.csdnblog2.ui;
importcom.csdn.csdnblog2.utils.UiUtils;
importandroid.content.Context;
importandroid.graphics.Canvas;
importandroid.graphics.DrawFilter;
importandroid.graphics.Paint;
importandroid.graphics.Paint.Style;
importandroid.graphics.PaintFlagsDrawFilter;
importandroid.util.AttributeSet;
importandroid.view.View;
{
//波紋顏色
privatestaticfinalintWAVE_PAINT_COLOR=0x880000aa;
//y=Asin(wx+b)+h
_FACTOR_A=20;
privatestaticfinalintOFFSET_Y=0;
//第一條水波移動速度
_X_SPEED_ONE=7;
//第二條水波移動速度
_X_SPEED_TWO=5;
privatefloatmCycleFactorW;
privateintmTotalWidth,mTotalHeight;
privatefloat[]mYPositions;
privatefloat[]mResetOneYPositions;
privatefloat[]mResetTwoYPositions;
privateintmXOffsetSpeedOne;
privateintmXOffsetSpeedTwo;
privateintmXOneOffset;
privateintmXTwoOffset;
privatePaintmWavePaint;
privateDrawFiltermDrawFilter;
publicDynamicWave(Contextcontext,AttributeSetattrs){
super(context,attrs);
//將dp轉化為px,用於控制不同解析度上移動速度基本一致
mXOffsetSpeedOne=UiUtils.dipToPx(context,TRANSLATE_X_SPEED_ONE);
mXOffsetSpeedTwo=UiUtils.dipToPx(context,TRANSLATE_X_SPEED_TWO);
//初始繪制波紋的畫筆
mWavePaint=newPaint();
//去除畫筆鋸齒
mWavePaint.setAntiAlias(true);
//設置風格為實線
mWavePaint.setStyle(Style.FILL);
//設置畫筆顏色
mWavePaint.setColor(WAVE_PAINT_COLOR);
mDrawFilter=newPaintFlagsDrawFilter(0,Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG);
}
@Override
protectedvoidonDraw(Canvascanvas){
super.onDraw(canvas);
//從canvas層面去除繪制時鋸齒
canvas.setDrawFilter(mDrawFilter);
resetPositonY();
for(inti=0;i<mTotalWidth;i++){
//減400隻是為了控制波紋繪制的y的在屏幕的位置,大家可以改成一個變數,然後動態改變這個變數,從而形成波紋上升下降效果
//繪制第一條水波紋
canvas.drawLine(i,mTotalHeight-mResetOneYPositions[i]-400,i,
mTotalHeight,
mWavePaint);
//繪制第二條水波紋
canvas.drawLine(i,mTotalHeight-mResetTwoYPositions[i]-400,i,
mTotalHeight,
mWavePaint);
}
//改變兩條波紋的移動點
mXOneOffset+=mXOffsetSpeedOne;
mXTwoOffset+=mXOffsetSpeedTwo;
//如果已經移動到結尾處,則重頭記錄
if(mXOneOffset>=mTotalWidth){
mXOneOffset=0;
}
if(mXTwoOffset>mTotalWidth){
mXTwoOffset=0;
}
//引發view重繪,一般可以考慮延遲20-30ms重繪,空出時間片
postInvalidate();
}
privatevoidresetPositonY(){
//mXOneOffset代表當前第一條水波紋要移動的距離
intyOneInterval=mYPositions.length-mXOneOffset;
//使用System.array方式重新填充第一條波紋的數據
System.array(mYPositions,mXOneOffset,mResetOneYPositions,0,yOneInterval);
System.array(mYPositions,0,mResetOneYPositions,yOneInterval,mXOneOffset);
intyTwoInterval=mYPositions.length-mXTwoOffset;
System.array(mYPositions,mXTwoOffset,mResetTwoYPositions,0,
yTwoInterval);
System.array(mYPositions,0,mResetTwoYPositions,yTwoInterval,mXTwoOffset);
}
@Override
protectedvoidonSizeChanged(intw,inth,intoldw,intoldh){
super.onSizeChanged(w,h,oldw,oldh);
//記錄下view的寬高
mTotalWidth=w;
mTotalHeight=h;
//用於保存原始波紋的y值
mYPositions=newfloat[mTotalWidth];
//用於保存波紋一的y值
mResetOneYPositions=newfloat[mTotalWidth];
//用於保存波紋二的y值
mResetTwoYPositions=newfloat[mTotalWidth];
//將周期定為view總寬度
mCycleFactorW=(float)(2*Math.PI/mTotalWidth);
//根據view總寬度得出所有對應的y值
for(inti=0;i<mTotalWidth;i++){
mYPositions[i]=(float)(STRETCH_FACTOR_A*Math.sin(mCycleFactorW*i)+OFFSET_Y);
}
}
}
二:非標准圓形液柱水波紋
前面的波形使用函數模擬,這個我們換種方式,採用圖進行實現,先用PS整張不像波紋的波紋圖;
為了銜接緊密,首尾都比較平,並高度一致;
思路:
1.使用一個圓形圖作為遮罩過濾波形圖;
2.平移波紋圖,即不斷改變繪制的波紋圖的區域,即srcRect;
3.當一個周期繪制完,則從波紋圖的最前面重新計算;
全部代碼如下
//初始化bitmap
privatevoidinitBitmap(){
mSrcBitmap=((BitmapDrawable)getResourceswww.yingtaow.com?getDrawable(R.drawable.wave_2000))
.getBitmap();
mMaskBitmap=((BitmapDrawable)getResources().getDrawable(
R.drawable.circle_500))
.getBitmap();
}
//初始化畫筆paint
privatevoidinitPaint(){
mBitmapPaint=newPaint();
//防抖動
mBitmapPaint.setDither(true);
//開啟圖像過濾
mBitmapPaint.setFilterBitmap(true);
mPicPaint=newPaint(Paint.ANTI_ALIAS_FLAG);
mPicPaint.setDither(true);
mPicPaint.setColor(Color.RED);
}
@Override
protectedvoidonSizeChanged(intw,inth,intoldw,intoldh){
super.onSizeChanged(w,h,oldw,oldh);
mTotalWidth=w;
mTotalHeight=h;
mCenterX=mTotalWidth/2;
mCenterY=mTotalHeight/2;
mSrcRect=newRect();
mDestRect=newRect(0,0,mTotalWidth,mTotalHeight);
intmaskWidth=mMaskBitmap.getWidth();
intmaskHeight=mMaskBitmap.getHeight();
mMaskSrcRect=newRect(0,0,maskWidth,maskHeight);
mMaskDestRect=newRect(0,0,mTotalWidth,mTotalHeight);
}
}