android 개발의 wheel 컨트롤 사용 설명
오늘 만들 효과도를 살펴보자.
이것은 우리가 오늘 할 효과도이다.그럼 시작하겠습니다.
1. wheel 획득
wheel은 GitHub의 소스 컨트롤러입니다. GitHub에서 직접 다운로드할 수 있습니다. 주소는https://github.com/maarek/android-wheel다운로드가 끝난 후에 우리는 안에 있는 wheel 파일을library로 직접 사용할 수도 있고, wheel에 있는 자바 클래스와 xml 파일을 프로젝트에 복사해서 사용할 수도 있다.
2. 사용법
먼저 기본 레이아웃 파일을 살펴보겠습니다.
<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" >
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text=" " />
<LinearLayout
android:id="@+id/content"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@id/title"
android:background="@drawable/layout_bg"
android:orientation="horizontal" >
<kankan.wheel.widget.WheelView
android:id="@+id/province_view"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1" >
</kankan.wheel.widget.WheelView>
<kankan.wheel.widget.WheelView
android:id="@+id/city_view"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1" >
</kankan.wheel.widget.WheelView>
<kankan.wheel.widget.WheelView
android:id="@+id/area_view"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1" >
</kankan.wheel.widget.WheelView>
</LinearLayout>
<Button
android:id="@+id/confirm"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/content"
android:onClick="onClick"
android:text=" " />
</RelativeLayout>
자, 메인 레이아웃 파일에서 우리는 세 개의 WheelView를 사용했는데 각각 성, 시, 현을 표시하는 데 사용되었다.MainActivity에서 우리는 먼저 이 세 개의 컨트롤을 가져와야 한다.provinceView = (WheelView) this.findViewById(R.id.province_view);
cityView = (WheelView) this.findViewById(R.id.city_view);
areaView = (WheelView) this.findViewById(R.id.area_view);
받은 후에 우리는 Array Wheel Adapter 데이터 어댑터를 사용하여 데이터 어댑터를 맞추려고 한다. 여기에 두 개의 매개 변수가 필요하다. 하나는 상하문이고 다른 하나는 하나의 수조이다. 이 수조는 바로 우리가 전시해야 할 내용이다. 즉, 우리는 성, 시, 구를 모두 수조로 저장하는 형식이다. 그러나 한 성은 여러 시, 한 시는 여러 개의 현에 대응하고 한 시는 여러 개의 현에 대응한다.성과 현을 연결하기 위해 우리는 맵 집합을 사용해야 하기 때문에 우리가 디자인한 데이터 구조는 다음과 같다./**
*
*/
private String[] provinceArray;
/**
* -
*/
private Map<String, String[]> citiesMap;
/**
* -
*/
private Map<String, String[]> areasMap;
첫 번째 그룹에는 모든 성의 데이터가 저장되고, 두 번째 맵에는 모든 성에 대응하는 시의 데이터가 저장되며, 세 번째 맵에는 모든 시에 대응하는 구와 현의 데이터가 저장된다. 우리는 지금 세 가지 데이터 집합에 값을 부여해야 한다. 먼저 우리의 json 데이터 형식을 살펴보자.[{"name":" ","city":[{"name":" ","area":[" "," "," "," "...]}]}.....]
우리의 json 데이터는 바로 이런 형식이다. json 데이터는 assets 폴더에 존재한다. 다음은 json 데이터를 어떻게 해석하고 위의 세 개의 데이터 집합에 값을 부여하는지 살펴보자. private void initJson() {
citiesMap = new HashMap<String, String[]>();
areasMap = new HashMap<String, String[]>();
InputStream is = null;
try {
StringBuffer sb = new StringBuffer();
is = getAssets().open("city.json");
int len = -1;
byte[] buf = new byte[1024];
while ((len = is.read(buf)) != -1) {
sb.append(new String(buf, 0, len, "gbk"));
}
JSONArray ja = new JSONArray(sb.toString());
provinceArray = new String[ja.length()];
String[] citiesArr = null;
for (int i = 0; i < provinceArray.length; i++) {
JSONObject jsonProvince = ja.getJSONObject(i);
provinceArray[i] = jsonProvince.getString("name");
JSONArray jsonCities = jsonProvince.getJSONArray("city");
citiesArr = new String[jsonCities.length()];
for (int j = 0; j < citiesArr.length; j++) {
JSONObject jsonCity = jsonCities.getJSONObject(j);
citiesArr[j] = jsonCity.getString("name");
JSONArray jsonAreas = jsonCity.getJSONArray("area");
String[] areaArr = new String[jsonAreas.length()];
for (int k = 0; k < jsonAreas.length(); k++) {
areaArr[k] = jsonAreas.getString(k);
}
areasMap.put(citiesArr[j], areaArr);
}
citiesMap.put(provinceArray[i], citiesArr);
}
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
} finally {
if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
json 해석 기술에 어려운 점이 없다. 이곳의 논리는 약간 복잡하고 세 개의 끼워 넣은 for 순환을 사용했기 때문에 천천히 생각해 봐도 어렵지 않다.자, 데이터 세트에 데이터가 있으면 세 개의 wheel에 어댑터를 설정할 수 있습니다. private void initView() {
provinceView.setViewAdapter(new ArrayWheelAdapter<String>(
MainActivity.this, provinceArray));
// ( )
cityView.setViewAdapter(new ArrayWheelAdapter<String>(
MainActivity.this, citiesMap.get(" ")));
//
areaView.setViewAdapter(new ArrayWheelAdapter<String>(
MainActivity.this, areasMap.get(" ")));
//
provinceView.setCurrentItem(0);
//
cityView.setCurrentItem(0);
//
areaView.setCurrentItem(0);
// 7
provinceView.setVisibleItems(7);
cityView.setVisibleItems(7);
areaView.setVisibleItems(7);
//
provinceView.addChangingListener(this);
cityView.addChangingListener(this);
}
어댑터를 설치한 후에 우리는 몇 가지 부족한 값을 설정했다. 모두 간단하다. 모두가 직접 주석을 보면 된다. 우리는 두 가지 감청 사건을 설정했다. 우리는 다음과 같다.@Override
public void onChanged(WheelView wheel, int oldValue, int newValue) {
if (wheel == provinceView) {
//
updateCity();
updateArea();
} else if (wheel == cityView) {
//
updateArea();
}
}
private void updateArea() {
// City
int cityIndex = cityView.getCurrentItem();
//
int provinceIndex = provinceView.getCurrentItem();
//
String proviceName = provinceArray[provinceIndex];
//
String currentName = citiesMap.get(proviceName)[cityIndex];
//
String[] areas = areasMap.get(currentName);
// areaView
areaView.setViewAdapter(new ArrayWheelAdapter<String>(
MainActivity.this, areas));
//
areaView.setCurrentItem(0);
}
private void updateCity() {
//
int currentIndex = provinceView.getCurrentItem();
//
String currentName = provinceArray[currentIndex];
//
String[] cities = citiesMap.get(currentName);
// cityView
cityView.setViewAdapter(new ArrayWheelAdapter<String>(
MainActivity.this, cities));
//
cityView.setCurrentItem(0);
}
거의 모든 줄 코드에 주석이 있으니 잔소리하지 않겠습니다. 마지막으로 클릭 이벤트를 다시 봅시다. public void onClick(View v) {
//
int provinceIndex = provinceView.getCurrentItem();
//
String provinceName = provinceArray[provinceIndex];
//
int cityIndex = cityView.getCurrentItem();
//
String cityName = citiesMap.get(provinceName)[cityIndex];
//
int areaIndex = areaView.getCurrentItem();
Toast.makeText(
this,
" " + provinceArray[provinceIndex] + cityName
+ areasMap.get(cityName)[areaIndex], Toast.LENGTH_SHORT)
.show();
}
자, 여기서 우리가 원하는 기능은 기본적으로 실현되었다. 그러나 우리는 시스템의 기본 양식이 약간 추하다는 것을 알 수 있다. 그러면 우리는 원본 코드를 수정해서 우리가 원하는 양식을 얻을 수 있다. 먼저 위아래의 검은 쪽은 여기를 볼 수 있다.private int[] SHADOWS_COLORS = new int[] { 0xFF111111, 0x00AAAAAA,
0x00AAAAAA };
WheelView.자바 파일에서 이 줄 코드는 상하의 검은색 변의 색 변화를 정의했다. 세 가지 파라미터는 각각 시작 색, 과도 색, 끝날 때의 색이다. 그러면 우리는 이곳의 원본 코드를 수정하여 상하의 검은색 변을 제거할 수 있다. 그리고 중간에 투명한 동쪽의 검은색 변을 바꾸려고 한다. 원본을 통해 이 파일을 찾았다. wheelval.xml:<shape xmlns:android="http://schemas.android.com/apk/res/android">
<gradient
android:startColor="#70222222"
android:centerColor="#70222222"
android:endColor="#70EEEEEE"
android:angle="90" />
<stroke android:width="1dp" android:color="#70333333" />
</shape>
중간에 있는 투명 줄의 양식을 정의하여 우리는 자신의 필요에 따라 수정할 수 있다.자, 이곳의 원본 코드가 많지 않고 어렵지 않으니 여러분이 직접 생각해 보십시오. wheel에 대한 소개는 우리가 이렇게 많이 말할 수 있습니다.본문 데모 다운로드https://github.com/lenve/wheelTest
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.