六邊形RecyclerView
吐槽
來個效果圖吧先~
哎╮(╯▽╰)╭本月的開發專案終於在月底的時候拿到了介面,所以趕緊用迅雷掩耳不及盜鈴之響叮噹之勢擼完了那個從Eclipse中匯入的古董級專案.今天早上看到了個效果,感覺還挺有意思的,照著擼了一下,記錄總結一下實現過程吧
Github地址 https://github.com/fushuangdage/CustomView
簡介
其實也沒啥,這個動畫效果是RecyclerView 自帶的,之前一直用notifyDateSetChange(),一直沒有發現,其實recyclerview很好心的自帶了插入動畫,呼叫notifyItemInserted()插入即可
自己寫的也就兩個部分,第一自定義Drawable ,類似自定義view吧,將圖片化成六邊形.第二,通過自定義LayoutManager實現按照六邊形位置擺放1~7個子控制元件(原文是可以新增很多圈的,我就簡單寫寫了)
public class HiveDrawable extends Drawable {
private Bitmap mBitmap;
private Paint paint;
private Path path;
private Rect rect;
public HiveDrawable(Bitmap bitmap) {
init();
if (bitmap!=null){
BitmapShader shader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
paint.setShader(shader);
}
}
@Override
public int getIntrinsicHeight() {
if (mBitmap!=null){
return mBitmap.getHeight();
}else {
return super.getIntrinsicHeight();
}
}
@Override
public int getIntrinsicWidth() {
if (mBitmap!=null){
return mBitmap.getWidth();
}else {
return super.getIntrinsicWidth();
}
}
@Override
public void setBounds(int left, int top, int right, int bottom) {
super.setBounds(left, top, right, bottom);
rect = new Rect();
rect.set(left,top,right,bottom);
int l = rect.width() / 2; //考慮橫向的情況
int h = rect.height();
double v = Math.sqrt(3) / 2;
path.reset();
path.moveTo(left,h/2);
path.lineTo(left+l/2, (float) (h/2-v*l));
path.lineTo(right-l/2, (float) (h/2-v*l));
path.lineTo(right,h/2);
path.lineTo(right-l/2, (float) (h/2+v*l));
path.lineTo(left+l/2, (float) (h/2+v*l));
path.moveTo(left,h/2);
path.close();
}
private void init() {
if (paint==null){
paint = new Paint();
paint.setAntiAlias(true);
paint.setStyle(Paint.Style.FILL);
paint.setStrokeWidth(3f);
}
if (path==null){
path = new Path();
}
}
@Override
public void draw(@NonNull Canvas canvas) {
canvas.drawPath(path,paint);
}
@Override
public void setAlpha(@IntRange(from = 0, to = 255) int alpha) {
if (paint!=null){
paint.setAlpha(alpha);
}
}
@Override
public void setColorFilter(@Nullable ColorFilter colorFilter) {
if (paint!=null)
paint.setColorFilter(colorFilter);
}
@Override
public int getOpacity() {
return 0;
}
}
自定義LayouManager
public class HiveLayoutManager extends RecyclerView.LayoutManager {
private List<List<RectF>> positionList=new ArrayList();
@Override
public RecyclerView.LayoutParams generateDefaultLayoutParams() {
return new RecyclerView.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
}
@Override
public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
detachAndScrapAttachedViews(recycler);
// removeAllViews();
int childCount = state.getItemCount();
View first = recycler.getViewForPosition(0);
measureChildWithMargins(first,0,0);
int left = (getWidth() - getDecoratedMeasuredWidth(first)) / 2;
int right=(getWidth() + getDecoratedMeasuredWidth(first)) / 2;
int top=(getHeight()-getDecoratedMeasuredHeight(first))/2;
int bottom=(getHeight()+getDecoratedMeasuredHeight(first))/2;
//數學計算 每一層的最後一個都為 n*n*3+3*n+1
addView(first);
layoutDecoratedWithMargins(first,left,top,right,bottom);
int num=childCount>7?7:childCount;
int cX = getWidth() / 2;
int cY = getHeight() / 2;
for (int i = 1; i <num; i++) {
View view = recycler.getViewForPosition(i);
addView(view);
measureChildWithMargins(view,0,0);
int height = getDecoratedMeasuredHeight(view);
int width = getDecoratedMeasuredWidth(view);
double cos = Math.cos(Math.PI /3* (i - 1));
double sin = Math.sin(Math.PI /3 *(i - 1));
double viewCY = getHeight()/2-height * cos;
double viewCX = getWidth()/ 2 - height * sin;
layoutDecoratedWithMargins(view, ((int) (viewCX - width / 2)), ((int) (viewCY - height / 2))
,((int) (viewCX + width / 2)), ((int) (viewCY + height / 2)));
}
}
}
相關文章
- 六邊形架構架構
- 2394 輸出六邊形
- 六邊形架構 Java 實現架構Java
- 六邊形架構入門 - levelup架構
- 微信小程式-測試遊戲生成六邊多邊形微信小程式遊戲
- css六邊形效果程式碼例項CSS
- 如何利用CSS寫一個六邊形?CSS
- [WebGL入門]六,頂點和多邊形Web
- 初識“六邊形”架構設計理論架構
- 為什麼需要六邊形架構?- silkandspinach架構
- 在 .NET Core 中應用六邊形架構架構
- H5 六邊形消除遊戲開發H5遊戲開發
- Java和Spring的六邊形架構 - reflectoringJavaSpring架構
- css實現圖片背景填充的正六邊形CSS
- HexMap學習筆記(一)——建立六邊形網格筆記
- 六邊形之埠和介面卡架構 - cockburn架構
- 六邊形架構:管理複雜性的解決方案架構
- domain-driven-hexagon:領域驅動六邊形的Javascript案例AIGoJavaScript
- RecyclerView零點突破(動畫+邊線篇)View動畫
- 不規則圖形背景排版高階技巧 -- 酷炫的六邊形網格背景圖
- 蜂巢型六邊形A星尋路演算法unity完整流程演算法Unity
- 從零開始做一個SLG遊戲(一):六邊形網格遊戲
- 多邊形填充-活動邊表法
- opencv多邊形逼近OpenCV
- SVG <polygon> 多邊形SVGGo
- Kotlin和SpringBoot開發的六邊形架構應用案例KotlinSpring Boot架構
- 六邊形架構教程:構建可維護的Web應用程式 - DEV架構Webdev
- domain-driven-hexagon: 領域驅動六邊形架構學習資料AIGo架構
- 馬龍全運會再獲佳績,通訊界也有“六邊形戰士”
- 四邊形輔助線做法
- 使用六邊形架構解耦技術程式碼與業務邏輯 - Julien Topçu架構解耦
- [CSS LEARN]Border與多邊形CSS
- 【JAVA】多邊形重心計算Java
- Facebook 面試題 | 凸多邊形面試題
- 六邊形架構:使用事件驅動的無伺服器實現鬆耦合 - Ellerby架構事件伺服器
- 六邊形架構:使用事件驅動的無伺服器實現松耦合 - Ellerby架構事件伺服器
- matlab繪製正多邊形Matlab
- 【計算幾何】多邊形交集