第十一PickerView

本文详细介绍Android中PickerView控件的功能与使用方法,包括基础控件WheelView、选项选择器OptionsPickerView及时间选择器TimePickerView。同时介绍了UI自动适配框架AndroidAutoSize的配置与使用。

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

一、PickerView

1 、PickerView是什么

仿iOS的PickerView控件,带有3D圆弧效果,并封装了时间选择和选项选择这两种选择器。

WheelView —— 基础控件
带有3D圆弧效果。
支持文字、颜色、大小设置。
支持背景颜色设置。
支持item的分隔线设置。
支持item间距设置。
支持设置是否循环。

OptionsPickerView —— 选项选择器
支持一、二、三级联动数据。
支持一、二、三级不联动数据。
支持自定义布局。
支持自定义标题栏。
支持“省,市,区”等选项的单位(label)显示、隐藏和自定义。
支持dialog 模式显示。
支持自定义设置容器。
支持实时回调监听。
联动数据支持切换Item时,还原为第一项。

TimePickerView —— 时间选择器
支持选择年、月、日的范围。
支持年月日时分秒显示。
支持设置当前默认时间。
支持自定义布局。
支持自定义标题栏。
支持“年,月,日,时,分,秒”等选项的单位(label)显示、隐藏和自定义。
支持dialog 模式显示。
支持自定义设置容器。
支持实时回调监听。

作者:贤兵
链接:https://www.jianshu.com/p/a969bf046084
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

2、使用方式

1.WheelView的使用

依赖

compile 'com.contrarywind:Android-PickerView:4.1.9'

layout中配置布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

  <com.contrarywind.view.WheelView
      android:id="@+id/wheel"
      android:layout_width="match_parent"
      android:layout_height="wrap_content" />

</LinearLayout>

代码

package com.example.day11;

import android.os.Bundle;
import android.util.Log;
import android.widget.ArrayAdapter;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

import com.bigkoo.pickerview.adapter.ArrayWheelAdapter;
import com.contrarywind.listener.OnItemSelectedListener;
import com.contrarywind.view.WheelView;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";
    private WheelView wheel;
    private ArrayWheelAdapter<String> mMyAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        wheel.setOnItemSelectedListener(new OnItemSelectedListener() {
            @Override
            public void onItemSelected(int index) {
//                Toast.makeText(MainActivity.this, index, Toast.LENGTH_SHORT).show();
                Log.i(TAG, "onItemSelected: "+index);
            }
        });

        ArrayList<String> list = new ArrayList<>();
        list.add("123");
        list.add("234");
        list.add("567");
        mMyAdapter= new ArrayWheelAdapter(list);
        wheel.setAdapter(mMyAdapter);

    }

    private void initView() {
        wheel = (WheelView) findViewById(R.id.wheel);
    }
}

}

效果图

在这里插入图片描述
注意:
OnItemSelectedListener中回调被选中的值
mWheelView.getCurrentItem()得到当前选中的值

2.TimePickerView的使用 时间

代码

private void showTimePickerView() {
    TimePickerView pvTime = new TimePickerBuilder(MainActivity.this, new OnTimeSelectListener() {
        @Override
        public void onTimeSelect(Date date, View v) {
            Toast.makeText(MainActivity.this, date.toString(), Toast.LENGTH_SHORT).show();
        }
    }).build();
    pvTime.show();//显示时间选择器
}

在这里插入图片描述

3.级联选择

代码

private void initOptionPicker() {
    List<String> options1Items = new ArrayList<>();
    options1Items.add("射雕英雄传");
    options1Items.add("神雕侠侣");
    options1Items.add("鹿鼎记");

    List<String> options2Items_01 = new ArrayList<>();
    options2Items_01.add("郭靖");
    options2Items_01.add("黄蓉");
    options2Items_01.add("杨铁心");
    options2Items_01.add("欧阳克");
    List<String> options2Items_02 = new ArrayList<>();
    options2Items_02.add("小龙女");
    options2Items_02.add("杨过");
    options2Items_02.add("大雕");
    List<String> options2Items_03 = new ArrayList<>();
    options2Items_03.add("小柜子");
    options2Items_03.add("康熙");
    options2Items_03.add("康亲王");
    options2Items_03.add("鳌拜");

    List<List<String>> options2Items = new ArrayList<>();
    options2Items.add(options2Items_01);
    options2Items.add(options2Items_02);
    options2Items.add(options2Items_03);


    OptionsPickerView optionsPickerView = new OptionsPickerBuilder(this, new OnOptionsSelectListener() {
        @Override
        public void onOptionsSelect(int options1, int options2, int options3, View v) {
            String tx = options1Items.get(options1)
                    + options2Items.get(options1).get(options2);
            Toast.makeText(getBaseContext(), tx, Toast.LENGTH_SHORT).show();
        }
    })
            .setOptionsSelectChangeListener(new OnOptionsSelectChangeListener() {
                @Override
                public void onOptionsSelectChanged(int options1, int options2, int options3) {
                    String str = "options1: " + options1 + "\noptions2: " + options2 + "\noptions3: " + options3;
                    Toast.makeText(MainActivity.this, str, Toast.LENGTH_SHORT).show();
                }
            })
            .build();

    optionsPickerView.setPicker(options1Items, options2Items);
    optionsPickerView.show();


}

在这里插入图片描述

二、AndroidAutoSize

1、dp,sp转px

px:像素
dp:虚拟像素,在不同的像素密度的设备上会自动适配
dip:同dp
sp:同dp相似,用于字体,会根据用户的字体大小偏好来缩放

public class DisplayUtils {
    /**
     * 根据手机的分辨率从 dp 的单位 转成为 px(像素)
     */
    public static int dp2px(Context context, int dpValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
    }
    /**
     * 根据手机的分辨率从 px(像素) 的单位 转成为 dp
     */
    public static int px2dp(Context context, int pxValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (pxValue / scale + 0.5f);
    }
    /**
     * 将sp值转换为px值,保证文字大小不变
     */
    public static int sp2px(Context context, int spValue) {
        final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
        return (int) (spValue * fontScale + 0.5f);
    }
    /**
     * 将px值转换为sp值,保证文字大小不变
     */
    public static int px2sp(Context context, int pxValue) {
        final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
        return (int) (pxValue / fontScale + 0.5f);
    }
    /**
     * dp转为px
     * @param context
     * @param dp
     * @return
     */
    public static int dp2px_2(Context context, int dp) {
        return (int) TypedValue.applyDimension(
                TypedValue.COMPLEX_UNIT_DIP, dp,
                context.getResources().getDisplayMetrics());
    }
    /**
     * sp转为px
     * @param context
     * @param sp
     * @return
     */
    public static int sp2px_2(Context context, int sp) {
        return (int) TypedValue.applyDimension(
                TypedValue.COMPLEX_UNIT_SP, sp,
                context.getResources().getDisplayMetrics());
    }
}

2、UI自动适配框架配置以及使用

AutoLayout(已废弃,不建议使用)
[停止维护]Android屏幕适配方案,直接填写设计图上的像素尺寸即可完成适配,最大限度解决适配问题。
https://github.com/hongyangAndroid/AndroidAutoLayout

AndroidAotuSize
A low-cost Android screen adaptation solution (今日头条屏幕适配方案终极版,一个极低成本的 Android 屏幕适配方案).
https://github.com/JessYanCoding/AndroidAutoSize

作者:贤兵
链接:https://www.jianshu.com/p/a969bf046084
来源:简书

1.依赖

implementation 'me.jessyan:autosize:1.2.1'

2.在 清单AndroidManifest 中填写全局设计图尺寸 (单位 dp)

<manifest>
    <application>            
        <meta-data
            android:name="design_width_in_dp"
            android:value="360"/>
        <meta-data
            android:name="design_height_in_dp"
            android:value="640"/>           
     </application>           
</manifest>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值