zoukankan      html  css  js  c++  java
  • Android-自定义联系人快速索引

    效果图:

    布局去指定

    view.custom.shangguigucustomview.MyCustomIndexView 自定义View对象
    <!-- 自定义联系人快速索引 -->
    <RelativeLayout
        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:orientation="vertical"
        tools:context=".ShangGuiguTestActivity">
    
        <ListView
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
        </ListView>
    
        <TextView
            android:id="@+id/tv_word"
            android:layout_width="80dp"
            android:layout_height="80dp"
            android:background="#22000000"
            android:layout_centerInParent="true"
            android:textSize="40dp"
            android:textColor="@android:color/black"
            android:gravity="center_horizontal|center_vertical"
            android:visibility="gone"
            />
    
        <view.custom.shangguigucustomview.MyCustomIndexView
            android:id="@+id/mycustom_indexview"
            android:layout_width="30dp"
            android:layout_height="match_parent"
            android:layout_alignParentRight="true"
            android:background="#f00000"
            />
    
    </RelativeLayout>

    自定义联系人快速索引处理类:

    public class MyCustomIndexView extends View { // 为什么是继承View,因为不需要操纵孩子,只需要操纵TextView
    
        private static final String TAG = MyCustomIndexView.class.getSimpleName();
    
        private String[] words = {"A", "B", "C", "D", "E", "F", "G", "H", "I",
                "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V",
                "W", "X", "Y", "Z"};
    
        private IMyCustomIndexBack iBack2;
    
        public void setBack(IMyCustomIndexBack iBack2) {
            this.iBack2 = iBack2;
        }
    
    
        private Paint paint;
    
        public MyCustomIndexView(Context context, @Nullable AttributeSet attrs) {
            super(context, attrs);
    
            paint = new Paint();
            paint.setTextSize(40);
            paint.setAntiAlias(true);
            paint.setTypeface(Typeface.DEFAULT_BOLD);
            paint.setColor(Color.WHITE);
        }
    
        private int indexViewWidth;
        private int itemIndexViewHeight;
    
        private int heightMeasureSpec;
    
        private int itemHeight;
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    
            itemIndexViewHeight = heightMeasureSpec / words.length;
            indexViewWidth = widthMeasureSpec;
    
            this.heightMeasureSpec = heightMeasureSpec;
    
            // setMeasuredDimension(indexViewWidth, indexViewHeight);
    
            // itemHeight = getMeasuredHeight() / words.length;
            itemHeight = MeasureSpec.getSize(heightMeasureSpec) / words.length;
    
            Log.i(TAG, "高度实验: getMeasuredHeight():"+getMeasuredHeight() + " heightMeasureSpec:" + heightMeasureSpec);
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
    
            int w = MeasureSpec.getSize(indexViewWidth);
            int h = MeasureSpec.getSize(itemIndexViewHeight);
            int defaultH = MeasureSpec.getSize(heightMeasureSpec);
    
            int defaultH26 = defaultH / words.length;
    
    
            for (int i=0; i<words.length;i++) {
                if (wordIndexValue==i) {
                    paint.setColor(Color.BLACK);
                    paint.setTextSize(50);
                } else {
                    paint.setColor(Color.WHITE);
                    paint.setTextSize(40);
                }
    
                String word = words[i];
    
                // 我要得到字体到宽度
                Rect rect = new Rect();
                // 需要用到画笔 把值处理好传递给Rect
                paint.getTextBounds(word, 0, 1, rect);
    
                canvas.drawText(word, (w/2) - rect.width()/2, i==0?defaultH26:defaultH26*(i+1), paint);
            }
    
        }
    
        private int wordIndexValue = -1;
    
        private int tempWordIndexValue;
    
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            super.onTouchEvent(event);
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                case MotionEvent.ACTION_MOVE:
                    /*float endY = event.getY();
                    Log.i(TAG, "endy:" + endY);
                    // 得到字母索引
                    int abcIndex =  (int) (endY / itemIndexViewHeight);
                    Log.i(TAG, "abcIndex:" + abcIndex);*/
    
                    float Y = event.getY();
                    wordIndexValue = (int) (Y/itemHeight);//字母索引
                    Log.i(TAG, "wordIndexValue;" + wordIndexValue);
    
                    if (tempWordIndexValue != wordIndexValue) {
                        iBack2.back(wordIndexValue, words[wordIndexValue]);
                    }
                    tempWordIndexValue = wordIndexValue;
                    invalidate();
    
                    break;
                case MotionEvent.ACTION_UP:
                    iBack2.upEnd();
    
                    tempWordIndexValue = 0;
    
                    wordIndexValue = -1;
                    invalidate();
                    break;
                default:
                    break;
            }
            return true;
        }
    }

    如何使用自定义联系人快速索引:

    /**
             * 自定义联系人快速索引
             */
            tv_word = (TextView) findViewById(R.id.tv_word);
    
            final MyCustomIndexView  myCustomIndexView = findViewById(R.id.mycustom_indexview);
            myCustomIndexView.setBack(new IMyCustomIndexBack() {
                @Override
                public void back(int index, String word) {
                    tv_word.setVisibility(View.VISIBLE);
                    tv_word.setText(word);
                    // Toast.makeText(MainActivity.this, "index:" + index + " word:" + word, Toast.LENGTH_SHORT).show();
                }
    
                @Override
                public void upEnd() {
                    handler.sendEmptyMessageDelayed(0, 0);
                }
            });
    /**
         * 自定义联系人快速索引
         */
        private Handler handler = new Handler(){
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                AlphaAnimation alphaAnimation = new AlphaAnimation(1.0f, 0.0f);
                alphaAnimation.setDuration(3000);
                alphaAnimation.setFillAfter(true);
    
                tv_word.startAnimation(alphaAnimation);
                // tv_word.setVisibility(View.GONE);
            }
        };
  • 相关阅读:
    黄聪:.NET中zip的压缩和解压——SharpCompress
    黄聪:在.NET中使用GeckoFX 29
    【转】C# 开发Chrome内核浏览器(WebKit.net)
    Can annotations be created or edited in ArcGIS Pro?
    ArcGIS Pro 新建一个Aprx,导入Mxd
    ArcGIS Pro项目保存和数据编辑保存
    ArcGIS Pro批量线分割面,也可以线分割线
    ArcGIS Pro 删除选择范围的数据和批量裁剪clip
    ArcGIS Pro NearestVertex和NearestPoint
    ArcGIS Pro打印预览
  • 原文地址:https://www.cnblogs.com/android-deli/p/9661231.html
Copyright © 2011-2022 走看看