1. 程式人生 > >wheelview--->安卓滾輪控制元件

wheelview--->安卓滾輪控制元件

沒有太多時間,直接上控制元件原始碼吧,直接從github上也可以找到,有很重量級的.包括三級聯動的,全國省市,時間選擇(貌似時間選擇的用自帶的 datepicker還是很不錯的哦)

專案結構和layout

控制元件的樣子
dialog中的樣子
package com.example.administrator.myapplication;

import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.Log;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

/**
* Author: wangjie
* Email: [email protected]
* Date: 7/1/14.
*/
public class WheelView extends ScrollView {
public static final String TAG = WheelView.class.getSimpleName();

public static class OnWheelViewListener {
    public void onSelected(int selectedIndex, String item) {
    }
}


private Context context;

// private ScrollView scrollView;

private LinearLayout views;

public WheelView(Context context) {
    super(context);
    init(context);
}

public WheelView(Context context, AttributeSet attrs) {
    super(context, attrs);
    init(context);
}

public WheelView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    init(context);
}

//    String[] items;
List<String> items;

private List<String> getItems() {
    return items;
}

public void setItems(List<String> list) {
    if (null == items) {
        items = new ArrayList<String>();
    }
    items.clear();
    items.addAll(list);

    // 前面和後面補全
    for (int i = 0; i < offset; i++) {
        items.add(0, "");
        items.add("");
    }

    initData();

}


public static final int OFF_SET_DEFAULT = 1;
int offset = OFF_SET_DEFAULT; // 偏移量(需要在最前面和最後面補全)

public int getOffset() {
    return offset;
}

public void setOffset(int offset) {
    this.offset = offset;
}

int displayItemCount; // 每頁顯示的數量

int selectedIndex = 1;


private void init(Context context) {
    this.context = context;

// scrollView = ((ScrollView)this.getParent());
// Log.d(TAG, “scrollview: ” + scrollView);
Log.d(TAG, “parent: ” + this.getParent());
// this.setOrientation(VERTICAL);
this.setVerticalScrollBarEnabled(false);

    views = new LinearLayout(context);
    views.setOrientation(LinearLayout.VERTICAL);
    this.addView(views);

    scrollerTask = new Runnable() {

        public void run() {

            int newY = getScrollY();
            if (initialY - newY == 0) { // stopped
                final int remainder = initialY % itemHeight;
                final int divided = initialY / itemHeight;

// Log.d(TAG, “initialY: ” + initialY);
// Log.d(TAG, “remainder: ” + remainder + “, divided: ” + divided);
if (remainder == 0) {
selectedIndex = divided + offset;

                    onSeletedCallBack();
                } else {
                    if (remainder > itemHeight / 2) {
                        WheelView.this.post(new Runnable() {
                            @Override
                            public void run() {
                                WheelView.this.smoothScrollTo(0, initialY - remainder + itemHeight);
                                selectedIndex = divided + offset + 1;
                                onSeletedCallBack();
                            }
                        });
                    } else {
                        WheelView.this.post(new Runnable() {
                            @Override
                            public void run() {
                                WheelView.this.smoothScrollTo(0, initialY - remainder);
                                selectedIndex = divided + offset;
                                onSeletedCallBack();
                            }
                        });
                    }


                }


            } else {
                initialY = getScrollY();
                WheelView.this.postDelayed(scrollerTask, newCheck);
            }
        }
    };


}

int initialY;

Runnable scrollerTask;
int newCheck = 50;

public void startScrollerTask() {

    initialY = getScrollY();
    this.postDelayed(scrollerTask, newCheck);
}

private void initData() {
    displayItemCount = offset * 2 + 1;

    for (String item : items) {
        views.addView(createView(item));
    }

    refreshItemView(0);
}

int itemHeight = 0;

private TextView createView(String item) {
    TextView tv = new TextView(context);
    tv.setLayoutParams(new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
    tv.setSingleLine(true);
    tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20);
    tv.setText(item);
    tv.setGravity(Gravity.CENTER);
    int padding = dip2px(15);
    tv.setPadding(padding, padding, padding, padding);
    if (0 == itemHeight) {
        itemHeight = getViewMeasuredHeight(tv);
        Log.d(TAG, "itemHeight: " + itemHeight);
        views.setLayoutParams(new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, itemHeight * displayItemCount));
        LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) this.getLayoutParams();
        this.setLayoutParams(new LinearLayout.LayoutParams(lp.width, itemHeight * displayItemCount));
    }
    return tv;
}


@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
    super.onScrollChanged(l, t, oldl, oldt);

// Log.d(TAG, “l: ” + l + “, t: ” + t + “, oldl: ” + oldl + “, oldt: ” + oldt);

// try {
// Field field = ScrollView.class.getDeclaredField(“mScroller”);
// field.setAccessible(true);
// OverScroller mScroller = (OverScroller) field.get(this);
//
//
// if(mScroller.isFinished()){
// Log.d(TAG, “isFinished…”);
// }
//
// } catch (Exception e) {
// e.printStackTrace();
// }

    refreshItemView(t);

    if (t > oldt) {

// Log.d(TAG, “向下滾動”);
scrollDirection = SCROLL_DIRECTION_DOWN;
} else {
// Log.d(TAG, “向上滾動”);
scrollDirection = SCROLL_DIRECTION_UP;

    }


}

private void refreshItemView(int y) {
    int position = y / itemHeight + offset;
    int remainder = y % itemHeight;
    int divided = y / itemHeight;

    if (remainder == 0) {
        position = divided + offset;
    } else {
        if (remainder > itemHeight / 2) {
            position = divided + offset + 1;
        }

// if(remainder > itemHeight / 2){
// if(scrollDirection == SCROLL_DIRECTION_DOWN){
// position = divided + offset;
// Log.d(TAG, “>down…position: ” + position);
// }else if(scrollDirection == SCROLL_DIRECTION_UP){
// position = divided + offset + 1;
// Log.d(TAG, “>up…position: ” + position);
// }
// }else{
//// position = y / itemHeight + offset;
// if(scrollDirection == SCROLL_DIRECTION_DOWN){
// position = divided + offset;
// Log.d(TAG, “

相關推薦

wheelview--->滾輪控制元件

沒有太多時間,直接上控制元件原始碼吧,直接從github上也可以找到,有很重量級的.包括三級聯動的,全國省市,時間選擇(貌似時間選擇的用自帶的 datepicker還是很不錯的哦) package com.example.administr

常用控制元件RecyclerView+HorizontalScrollView實現item側滑效果 常用控制元件RecyclerView+HorizontalScrollView實現item側滑效果

原 安卓常用控制元件RecyclerView+HorizontalScrollView實現item側滑效果 2017年10月28日 12:23:14 低-調

Android 開發:(三)常用控制元件以及仿《微門戶》登入介面實現

一、常用控制元件: 1、文字類控制元件 TextView 負責展示文字,非編輯 EditText 可編輯文字控制元件 2、按鈕類控制元件 Button 按鈕 ImageButton 圖片按鈕 RadioButton與RadioGroup 單

常用控制元件——按鈕、影象檢視與影象按鈕

目錄   一、按鈕(Button): 二、圖象檢視(Image View)   2、在XML中的屬性:     3、ImageView的background和src屬性有什麼區別: 三、影象按鈕(ImageButton)

設定控制元件的陰影效果:圖層效果LayerList

圖層列表 LayerDrawable 是管理其他可繪製物件陣列的可繪製物件。列表中的每個可繪製物件按照列表的順序繪製,列表中的最後一個可繪製物件繪於頂部。每個可繪製物件由單一 layer-list 元素內的 item 元素表示。 layer-list 對應的 J

四大控制元件之BroadcastReceiver詳解

BroadcastReceiver詳解 廣播的概念 Android:系統在產生某個事件時傳送廣播,應用程式使用廣播接收者接收這個廣播,就知道系統產生了什麼事件。 Android系統在執行的過程中,會產生很多事件,比如開機、電量改變、收發簡訊、撥打電話、螢

WebView控制元件完美支援h5 的video標籤

最近遇到該問題,國內好多網站的解決方法似乎都不起作用,最後終於在stackoverflow上找到了該解決方法: webView.getSettings().setMediaPlaybackRequiresUserGesture(false); http://stackov

Android控制元件ListView巢狀EditText控制元件

實現效果: 效果就是這樣,我們要實現這樣的效果,其實思路就是: 1、我們要記錄下按鈕的狀態,同時儲存文字框。 2、主要是在BaseAdapter中進行監聽。 class MyAdapter extends BaseAdapter{ private Map<Int

圖表控制元件WilliamChart使用指南

WilliamChart是github上的一個android圖表控制元件,專案地址:https://github.com/diogobernardino/WilliamChart 該圖表控制元件效果不錯,使用也比較方便。 參考它提供的示例程式,我寫了一個更加簡單的圖表程式,

Android自定義實現迴圈滾輪控制元件WheelView

首先呈上效果圖 現在很多地方都用到了滾輪佈局WheelView,比如在選擇生日的時候,風格類似系統提供的DatePickerDialog,開源的控制元件也有很多,不過大部分都是根據當前專案的需求繪製的介面,因此我就自己寫了一款比較符合自己專案的WheelView。 首先

介面基本元件---按鈕

所有的UI元件裡面,功能最容易被理解的恐怕就是按鈕。安卓UI元件中提供了兩個按鈕:普通按鈕和圖片按鈕,區別在於圖片按鈕顯示的是一個圖片。試想:開發遊戲程式介面,放置一個沒有任何效果的普通按鈕,將會大大降低遊戲的趣味。 由於按鈕比較簡單,所以本篇文章結構也比較簡單。文章前面介

入門---四大元件--ContentProvider

ContentProvider的功能和意義: 為了在應用程式之間交換資料,Android提供ContentProvider,ContentProvider是不同應用程式之間進行資料交換的標準API。當一個應用程式需要把自己的資料暴露給其他應用程式使用時,

開發中高階元件之選項卡的應用

在安卓開發的UI設計中,為了使介面更加清晰、美觀,我們經常用到選項卡來達到在一個介面中實現不同介面的切換。選項卡主要是由TabHost、TabWidget和FrameLayout三個元件組成,用於實現一個多標籤頁的使用者介面,通過它可以將一個複雜的對話方塊分割成

BLE APP控制LED燈的實現

//注:參考AmoMcu原始碼修改。 開啟APP,檢查藍芽是否開啟BluetoothAdapter mBluetoothAdapter; final BluetoothManager bluetoothManager =(BluetoothManager) getSys

如何控制不會重複請求網路

首先要說的是下面是一段虛擬碼,不能真實運用。主要就是說一下如何控制不會重複請求網路的方法。 //申明一個布林值變數,預設未false。 isReqing=false; //請求網路的方法 private void reqDatas() { //請

入門--四大元件--Service基本用法

Service是什麼 Service(服務)是一個沒有使用者介面的在後臺執行執行耗時操作的應用元件。其他應用元件能夠啟動Service,並且當用戶切換到另外的應用場景,Service將持續在後臺執行。另外,一個元件能夠繫結到一個service與之互動(I

日記——跨元件通訊神器RxBus

RxBus聽名字就知道與RxJava和EventBus有關啦 沒錯這其實是他們的結合體 其實寫一個簡單版的也真心不難,RxBus的程式碼只有十幾行,沒聽錯真的只有十幾行 不過首先你要了解RxJav

四大核心元件詳解

 四種載入模式的區別   所屬task的區別   一般情況下,“standard”和”singleTop”的activity的目標task,和收到的Intent的傳送者在同一個task內,就相當於誰呼叫它,它就跟誰在同一個Task中。   除非Intent包括引數FLAG_ACTIVITY_NEW_

Android View 滾輪控制元件LoopView+自定義Dialog [時間地域選擇器] Picker

發現了一些好的東西:  https://github.com/weidongjian/androidWheelView 曾經找到過 WheelView。當時江湖救急,直接用了。資料來源太大的話會導致效能降低。 當時有吐槽如果有使用自定義view或者繼承ListView

-03-控制UI界面

png image 分享圖片 com mage 四種 安卓 使用 .com 四種控制UI界面的方法 推薦01 1、使用XML控制布局UI界面 安卓-03-控制UI界面