Android 개발 진급 사용자 정의 컨트롤 의 미끄럼 스위치 실현 방법【데모 소스 다운로드 첨부】

이 사례 는 안 드 로 이 드 개발 진급 사용자 정의 컨트롤 의 미끄럼 스위치 실현 방법 을 설명 한다.여러분 께 참고 하도록 공유 하 겠 습 니 다.구체 적 으로 는 다음 과 같 습 니 다.
사용자 정의 스위치 컨트롤

Android 사용자 정의 컨트롤 은 일반적으로 세 가지 방식 이 있 습 니 다.
1.안 드 로 이 드 고유의 컨트롤 을 계승 하여 안 드 로 이 드 네 이 티 브 컨트롤 을 바탕 으로 기능 과 논 리 를 추가 합 니 다.
2.ViewGroup 을 계승 합 니 다.이러한 사용자 정의 컨트롤 은 자신의 레이아웃 에 다른 하위 컨트롤 을 추가 할 수 있 습 니 다.
3.View 를 계승 합 니 다.이러한 사용자 정의 컨트롤 은 원래 의 컨트롤 과 비슷 한 부분 이 많 지 않 고 자신의 뱃속 에 다른 하위 컨트롤 을 추가 할 필요 가 없습니다.
ToggleView 사용자 정의 스위치 컨트롤 표징 에 Android 네 이 티 브 컨트롤 과 비슷 한 점 이 없고 미 끄 러 지 는 효과 에 도 Android 네 이 티 브 를 답습 하 는 곳 이 없 기 때문에 사용자 정의 ToggleView 는 계승 View 를 선택 합 니 다.
같은 사용자 정의 컨트롤 은 세 가지 구조 방법 을 복사 해 야 합 니 다.

//            ,      style            ,
public ToggleView(Context context, AttributeSet attrs, int defStyle);
//                   
public ToggleView(Context context, AttributeSet attrs)
// Java     new      ,       
public ToggleView(Context context)

사용자 정의 컨트롤 이기 때문에 속성 은 스스로 정의 하 는 것 이 좋 습 니 다.여기 서 세 개의 속성 을 정의 합 니 다.
1.배경 그림
2.슬라이더 의 그림
3.레이아웃 의 기본 스위치 상태
그래서 사용자 정의 속성 을 사용 해 야 합 니 다.
values 디 렉 터 리 에 새 xml 파일,attrs.xml
안에서 자신의 속성 을 정의 합 니 다.

<?xml version="1.0" encoding="utf-8"?>
<resources>
 <declare-styleable name="toggle">
  <attr name="switchBackground" format="reference" />
  <attr name="slidingBackground" format="reference" />
  <attr name="toggleState" format="boolean" />
 </declare-styleable>
</resources>

은 R 파일 에서 이 속성 이름 을 찾 을 수 있 습 니 다.
탭 에 속성 name 속성 을 쓰 면 속성 이름 을 표시 하고 format 는 속성 유형 을 표시 합 니 다.
여기 서 세 개의 속성 이름과 속성 유형 을 정의 합 니 다.
속성 과 사용자 정의 컨트롤 의 세 가지 구조 방법 이 완료 되 었 습 니 다.레이아웃 파일 에 사용자 정의 컨트롤 을 추가 할 수 있 습 니 다.

<RelativeLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:hss="http://schemas.android.com/apk/res/com.hss.toggle"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 >
 <com.hss.toggle.ToggleView
 android:id="@+id/toggleView"
 android:layout_height="wrap_content"
 android:layout_width="wrap_content"
 android:layout_centerInParent="true"
 hss:switchBackground="@drawable/switch_background"
 hss:slidingBackground="@drawable/slide_button_background"
 hss:toggleState="true"
 >
 </com.hss.toggle.ToggleView>
</RelativeLayout>

메모:내 가 사용자 정의 컨트롤 com.hss.toggle.Toggle View 에서 일부 속성 은 안 드 로 이 드 로 시작 하고 일부 속성 은 hss(내 가 정의 한 네 임 스페이스)로 시작 합 니 다.왜 일 까요?
이 영화 코드 두 번 째 줄 을 잘 보 세 요.

xmlns:hss="http://schemas.android.com/apk/res/com.hss.toggle"

나 는 여기에 한 줄 의 코드 를 쓰 고 있다.이것 은 values/attrs.xml 의 모든 항목 을 가 져 오 면 내 가 attrs.xml 에 있 는 속성 을 직접 사용 할 수 있다 는 것 을 설명 한다.
사용자 정의 속성 을 직접 사용 할 수 있 습 니 다.문 제 는 자바 코드 에서 사용자 정의 속성 값 을 어떻게 얻 느 냐 에 초점 을 맞 춰 야 합 니 다.
네 임 스페이스 와 사용자 정의 속성의 name 값 을 가 져 옵 니 다.코드 를 보십시오:

String namespace = "http://schemas.android.com/apk/res/com.hss.toggle";
int toggle_switchbackground = attrs.getAttributeResourceValue(namespace, "switchBackground", -1);
int toggle_slidingbackground = attrs.getAttributeResourceValue(namespace, "slidingBackground", -1);
toggle_state = attrs.getAttributeBooleanValue(namespace, "toggleState", false);

봤 어?이 방법 은 attr 인 자 를 사 용 했 기 때문에 사용자 정의 속성 값 을 가 져 오 는 작업 은 두 개의 인자 에서 실행 되 어야 합 니 다.
전체 사용자 정의 컨트롤 의 클래스 참조 코드:

package com.hss.toggle;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
/**
 *        
 * @author hss
 */
public class ToggleView extends View {
 private static final String TAG = "ToogleView";
 private Bitmap sliding_background;
 private Bitmap switch_background;
 private boolean isSliding = false;
 private boolean toggle_state = false;
 private int downX;
 private mToggleStateChangeListener;
 //     , xml       ,   style     
 public ToggleView(Context context, AttributeSet attrs, int defStyle) {
 super(context, attrs, defStyle);
 }
 //     , xml        ,    style     
 public ToggleView(Context context, AttributeSet attrs) {
 this(context, attrs, 0);
 // Java       xml          
 String namespace = "http://schemas.android.com/apk/res/com.hss.toggle";
 int toggle_switchbackground = attrs.getAttributeResourceValue(namespace, "switchBackground", -1);
 int toggle_slidingbackground = attrs.getAttributeResourceValue(namespace, "slidingBackground", -1);
 toggle_state = attrs.getAttributeBooleanValue(namespace, "toggleState", false);
 Log.i(TAG,""+toggle_slidingbackground+" "+toggle_switchbackground);
 //           
 setToggleSwitchBackground(toggle_switchbackground);
 setToggleSlidingBackground(toggle_slidingbackground);
 setToggleState(toggle_state);
 }
 //          new     
 public ToggleView(Context context) {
 this(context, null);
 }
 /**
 *             
 *
 * @param toggle_slidingbackground   ID
 */
 private void setToggleSlidingBackground(int toggle_slidingbackground) {
 sliding_background = BitmapFactory.decodeResource(getResources(),toggle_slidingbackground);
 }
 /**
 *       ,      
 *
 * @param toggle_switchbackground   ID
 */
 private void setToggleSwitchBackground(int toggle_switchbackground) {
 switch_background = BitmapFactory.decodeResource(getResources(),toggle_switchbackground);
 }
 @Override
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
 //       ,               
 setMeasuredDimension(switch_background.getWidth(),switch_background.getHeight());
 }
 @Override
 protected void onDraw(Canvas canvas) {
 //        ,  canvas           
 canvas.drawBitmap(switch_background, 0, 0, null);
 if (isSliding) {
 //       
  //            :(                  x   )-(       x   )
  int left = downX - sliding_background.getWidth() / 2;
  //         (         )  :(       )-(       )
  int rightAlign = switch_background.getWidth()- sliding_background.getWidth();
  //           0,,           
  if (left < 0) {
  left = 0;
  } else if (left > rightAlign) {
  //         》           ,          
  left = rightAlign;
  }
  //                   
  canvas.drawBitmap(sliding_background, left, 0, null);
 } else {
  //     ,              ,       
  if (toggle_state) {
  //        ,        
  int left = switch_background.getWidth() - sliding_background.getWidth();
  canvas.drawBitmap(sliding_background, left, 0, null);
  } else {
  //        ,        
  canvas.drawBitmap(sliding_background, 0, 0, null);
  }
 }
 super.onDraw(canvas);
 }
 @Override
 public boolean onTouchEvent(MotionEvent event) {
 //      
 int action = event.getAction();
 switch (action) {
 case MotionEvent.ACTION_DOWN:
  //       ,       ,          
  isSliding = true;
  downX = (int) event.getX();
  break;
 case MotionEvent.ACTION_MOVE:
  downX = (int) event.getX();
  break;
 case MotionEvent.ACTION_UP:
  //                ,      x    
  downX = (int) event.getX();
  isSliding = false;
  //             
  int center = switch_background.getWidth() / 2;
  boolean state = downX > center;
  //          ,            ,         
  if (toggle_state != state) {
  toggle_state = state;
  if (null != mToggleStateChangeListener) {
   mToggleStateChangeListener
    .onToggleState(toggle_state);
  }
  }
  break;
 }
 //    onDraw()  
 invalidate();
 return true;
 }
 //               
 public void setOnToggleStateLinstener(OnToggleStateChangeListener listen){
 mToggleStateChangeListener = listen;
 }
 public void setToggleState(boolean b) {
 toggle_state = b;
 }
 //      ,           
 public interface OnToggleStateChangeListener {
 public void onToggleState(boolean state);
 }
}

여기 서 사용자 정의 컨트롤 부분의 논 리 를 다 썼 습 니 다.빌려 서 MainActivity 에서 호출 하 십시오.

package com.hss.toggle;
import android.app.Activity;
import android.os.Bundle;
import com.hss.toggle.ToggleView.OnToggleStateChangeListener;
import com.hss.toggle.utils.ToastUtil;
public class MainActivity extends Activity{
 private ToggleView toggleView;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 // TODO Auto-generated method stub
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 toggleView = (ToggleView) findViewById(R.id.toggleView);
 toggleView.setOnToggleStateLinstener(new OnToggleStateChangeListener() {
  @Override
  public void onToggleState(boolean state) {
  showToast(state);
  }
 });
 }
 //                Toast    
 private void showToast(boolean state) {
 ToastUtil.makeSuddenlyToast(getApplicationContext(), state?" ":" ");
 }
}

ToastUtil 클래스 는 다음 과 같 습 니 다:

package com.hss.toggle.utils;
import android.content.Context;
import android.widget.Toast;
/**
 * @title Toast   
 * @author hss
 */
public class ToastUtil {
 private static Toast toast;
 /**
 *      Toast
 * @param context      
 * @param text       
 */
 public static void makeShortToast(Context context,String text){
 toast = Toast.makeText(context, text, Toast.LENGTH_SHORT);
 toast.show();
 }
 /**
 *       Toast
 * @param context      
 * @param text       
 */
 public static void makeLongToast(Context context,String text){
 toast = Toast.makeText(context, text, Toast.LENGTH_LONG);
 toast.show();
 }
 /**
 *   Toast
 * @param context      
 * @param text       
 */
 public static void makeSuddenlyToast(Context context,String text){
 if(toast==null){
  toast = Toast.makeText(context, text, Toast.LENGTH_SHORT);
 }
 toast.setText(text);
 toast.show();
 }
}

요약 하면 이번 사용자 정의 컨트롤 절 차 는 다음 과 같 습 니 다.
1.values/attrs.xml 에서 속성 과 속성 값 을 사용자 정의 하 는 데이터 형식
2.자바 코드 에서 사용자 정의 컨트롤 류 를 정의 하고 View 나 ViewGroup 또는 Android 원생 의 컨트롤 을 계승 하여 구조 방법 을 실현 하고 사용자 정의 속성의 값 을 얻 으 며 해당 하 는 논리 와 클릭 이 벤트 를 작성 합 니 다.
3.레이아웃 파일 에 사용자 정의 컨트롤 과 사용자 정의 속성 을 사용 합 니 다(네 임 스페이스 주의).
4.MainActivity 에서 호출
전체 인 스 턴 스 코드 는 여 기 를 클릭 하 십시오본 사이트 다운로드
더 많은 안 드 로 이 드 관련 내용 에 관심 이 있 는 독자 들 은 본 사이트 의 주 제 를 볼 수 있다.
본 고 에서 말 한 것 이 여러분 의 안 드 로 이 드 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기