自定义控件之滑动

本文介绍了一种自定义Android开关按钮的方法,通过继承View并利用Bitmap进行绘制,实现了滑动开关的效果。文章详细展示了如何根据触摸事件改变开关状态,并提供了完整的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import android.graphics.Color;
import android.os.Bundle;
import android.support.design.widget.TabLayout;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

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

public class MainActivity extends AppCompatActivity {
    private List<TextView> list;
    String[] array = {"推荐", "社会", "军事", "娱乐", "热点", "图片", "视频", "段子", "游戏", "体育"};
    private TabLayout mainTab;
    private ViewPager mainVp;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();
        getData();
    }

    private void initView() {
        mainTab = (TabLayout) findViewById(R.id.main_tab);
        mainVp = (ViewPager) findViewById(R.id.main_vp);
        mainTab.setTabMode(mainTab.MODE_SCROLLABLE);
        mainTab.setupWithViewPager(mainVp);
    }

    private void getData() {
        list = new ArrayList<TextView>();
        for (int i = 0; i < 10; i++) {
            TextView textView = new TextView(this);
            textView.setText("内容" + i);
            textView.setTextSize(22);
            textView.setTextColor(Color.RED);
            list.add(textView);
        }
        MyAdapter adapter = new MyAdapter();
        mainVp.setAdapter(adapter);
    }

    class MyAdapter extends PagerAdapter {

        @Override
        public int getCount() {
            return list.size();
        }

        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view == object;
        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            container.removeView((View) object);
        }

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            container.addView(list.get(position));
            return list.get(position);
        }

        @Override
        public CharSequence getPageTitle(int position) {
            return array[position];
        }
    }
}


==================================================================
package com.bawei.zhouwangwei.demo;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;

/**
 * Created by Mr.on 2017/9/5.
 */

public class MySwichBtn extends View {
    //滑块使用的图片
    Bitmap bitmap;
    //画笔
    Paint paint;
    //滑动图片的宽高
    int bitWidth;
    int bitHeight;
    //滑块在布局文件中设置的宽高
    float scaleWidth;
    float scaleHeight;
    //自定义属性数组
    TypedArray typedArray;
    //滑块的状态值
    boolean isCheck = false;
    //控件本身的宽高
    int viewWidth;
    int viewHeight;
    //手指点击X坐标值
    float pointX;

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

    public MySwichBtn(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        typedArray = context.obtainStyledAttributes(attrs, R.styleable.MySwichBtn);
        init(context);
    }

    public MySwichBtn(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context);
    }

    public void init(Context context) {
        paint = new Paint();
        bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
        bitWidth = bitmap.getWidth();
        bitHeight = bitmap.getHeight();
        scaleWidth = typedArray.getDimension(R.styleable.MySwichBtn_img_swich_width, bitWidth);
        scaleHeight = typedArray.getDimension(R.styleable.MySwichBtn_img_swich_height, bitHeight);
        float scaleX = (float) scaleWidth / (float) bitWidth;
        float scaleY = (float) scaleHeight / (float) bitHeight;
        Matrix matrix = new Matrix();
        matrix.postScale(scaleX, scaleY);
        bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitWidth, bitHeight, matrix, false);
        bitWidth = bitmap.getWidth();
        bitHeight = bitmap.getHeight();
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        //getMode()改方法用来获取宽高的模式
        int mode = MeasureSpec.getMode(widthMeasureSpec);
        viewWidth = MeasureSpec.getSize(widthMeasureSpec);
        switch (mode) {
            case MeasureSpec.AT_MOST:
                Log.i("===============", "AT_MOST: " + widthMeasureSpec);
                viewWidth = bitHeight * 3;
                break;
            case MeasureSpec.EXACTLY:
                Log.i("===============", "EXACTLY: " + widthMeasureSpec);
                break;
            case MeasureSpec.UNSPECIFIED:
                Log.i("===============", "UNSPECIFIED: ");
                break;
        }
        //该方法用来设置 最终的确定的宽高
        setMeasuredDimension(viewWidth, bitHeight);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (isCheck) {
            paint.setColor(Color.BLUE);
        } else {
            paint.setColor(Color.RED);
        }
        canvas.drawRect(0, 0, viewWidth, 200, paint);
        canvas.drawBitmap(bitmap, pointX, 0, paint);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_UP:
                if (event.getX() > viewWidth / 2) {
                    pointX = viewWidth - bitWidth;
                    isCheck = true;
                } else {
                    pointX = 0;
                    isCheck = false;
                }
                listener.onClick(isCheck);
                invalidate();
                break;
            default:
                pointX = event.getX() - bitWidth / 2;
                if (event.getX() > viewWidth - bitWidth / 2) {
                    pointX = viewWidth - bitWidth;
                }
                if (event.getX() < bitWidth / 2) {
                    pointX = 0;
                }

                invalidate();
                break;
        }
        return true;
    }

    public MyOnClickListener listener;

    public interface MyOnClickListener {
        public void onClick(boolean b);
    }

    public void setOnMyOnClickListener(MyOnClickListener listener) {
        this.listener = listener;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值