android 自定义粘性View,可寄生于其他控件给予其添加半透明spinner的效果

转载请注明出处:王亟亟的大牛之路

git上看到一个不错的“自定义寄生View”,个人觉得还是很有拓展性的,写篇博文介绍下

目录结构+运行效果

AS的项目,内容不多,就2个类,想整合进自己项目的话也不难

MainActivity

public class MainActivity extends ActionBarActivity
    implements OverMenuView.OnSelectionChangeListener, OverMenuView.OnMenuVisibilityChangeListener {
    private static final String TAG = "MainActivity";
    private ImageView mImageView;
    private OverMenuView overMenuView;
    private TextView textView;

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

        mImageView = (ImageView) findViewById(R.id.image);

        textView = (TextView) findViewById(R.id.text);

        overMenuView = (OverMenuView) findViewById(R.id.overmenu);
        overMenuView.setOnSelectionChangedListener(this);
        overMenuView.setOnMenuVisibilityChangeListener(this);

        try {
            loadImage("image.jpg");
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    private void loadImage(@NonNull final String file) throws IOException {
        final InputStream input = getAssets().open(file);
        Bitmap bitmap = BitmapFactory.decodeStream(input);
        mImageView.setImageBitmap(bitmap);
        input.close();
    }

    @Override
    public void onSelectionChanged(final int position) {
        Log.d(TAG, "onSelectionChanged: " + position);
        textView.setText(overMenuView.getEntries()[position]);
    }

    @Override
    public void onVisibilityChanged(final View view, final boolean visible) {
        Log.d(TAG, "onVisibilityChanged: " + view + ", " + visible);
    }
}

分析:
没有参杂什么逻辑,只是把assets目录下的图片set到imageview中并且把选择的结果放入textView呈现而已。

布局文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="0dip"
        android:layout_weight="1">

        <ImageView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/image" />

        <it.sephiroth.android.library.overlaymenu.OverMenuView
            app:overmenu_centerInView="@+id/image"
            android:entries="@array/overmenuEntries"
            android:id="@+id/overmenu"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </RelativeLayout>

    <LinearLayout
        android:layout_marginTop="@dimen/activity_vertical_margin"
        android:paddingLeft="16dip"
        android:paddingRight="16dip"
        android:gravity="center"
        android:background="?attr/colorPrimary"
        android:layout_width="match_parent"
        android:layout_height="90dip">

        <TextView
            android:text="@string/waiting_for_selection"
            android:id="@+id/text"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textAppearance="@style/TextAppearance.AppCompat.Title"
            android:gravity="center" />

    </LinearLayout>

</LinearLayout>

分析:
这里有一个自定义的标签xmlns:app="http://schemas.android.com/apk/res-auto"
也就是将我们的时间“绑定到”ImageView上去了而已!

下拉列表的数据源:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="overmenuEntries">
        <item>First Item</item>
        <item>Second Item</item>
        <item>Third Item</item>
        <item>Fourth Item</item>
        <item>Fifth Item</item>
        <item>Sixth Item</item>
        <item>Seventh Item</item>
    </string-array>
</resources>

具体代码可以看源码,源码地址:http://yunpan.cn/cmxaWSzZH3mqQ 访问密码 f898

时间: 2024-08-17 17:05:55

android 自定义粘性View,可寄生于其他控件给予其添加半透明spinner的效果的相关文章

Android 自定义 HorizontalScrollView 打造再多图片(控件)也不怕 OOM 的横向滑动效果

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38140505 自从Gallery被谷歌废弃以后,Google推荐使用ViewPager和HorizontalScrollView来实现Gallery的效果.的确HorizontalScrollView可以实现Gallery的效果,但是HorizontalScrollView存在一个很大的问题,如果你仅是用来展示少量的图片,应该是没问题的,但是如果我希望HorizontalScr

Android 自定义View 三板斧之一——继承现有控件

通常情况下,Android实现自定义控件无非三种方式. Ⅰ.继承现有控件,对其控件的功能进行拓展. Ⅱ.将现有控件进行组合,实现功能更加强大控件. Ⅲ.重写View实现全新的控件 本文重点讨论继承现有控件进行拓展实现自定义控件.这是一个非常重要的自定义控件的方法,可以站在原生控件这个巨人肩膀上,拓展自身的功能,一般来说,我们可以在ondraw方法中对原生控件进行绘制. 本文将以拓展textView为例,看我们是如何继承现有控件,来自定义一个强大控件.这个自定义控件就是带有边框文本框,并且边框与背

Android下拉刷新上拉加载控件(适用于所有View)_Android

     前面写过一篇关于下拉刷新控件的文章下拉刷新控件终结者:PullToRefreshLayout,后来看到好多人还有上拉加载更多的需求,于是就在前面下拉刷新控件的基础上进行了改进,加了上拉加载的功能.不仅如此,我已经把它改成了对所有View都通用!可以随心所欲使用这两个功能~~     我做了一个大集合的demo,实现了ListView.GridView.ExpandableListView.ScrollView.WebView.ImageView.TextView的下拉刷新和上拉加载.后

Android下拉刷新上拉加载控件(适用于所有View)

前面写过一篇关于下拉刷新控件的文章下拉刷新控件终结者:PullToRefreshLayout,后来看到好多人还有上拉加载更多的需求,于是就在前面下拉刷新控件的基础上进行了改进,加了上拉加载的功能.不仅如此,我已经把它改成了对所有View都通用!可以随心所欲使用这两个功能~~ 我做了一个大集合的demo,实现了ListView.GridView.ExpandableListView.ScrollView.WebView.ImageView.TextView的下拉刷新和上拉加载.后面会提供demo的

Android开发之无痕过渡下拉刷新控件的实现思路详解_Android

相信大家已经对下拉刷新熟悉得不能再熟悉了,市面上的下拉刷新琳琅满目,然而有很多在我看来略有缺陷,接下来我将说明一下存在的缺陷问题,然后提供一种思路来解决这一缺陷,废话不多说!往下看嘞! 1.市面一些下拉刷新控件普遍缺陷演示 以直播吧APP为例: 第1种情况: 滑动控件在初始的0位置时,手势往下滑动然后再往上滑动,可以看到滑动到初始位置时滑动控件不能滑动. 原因: 下拉刷新控件响应了触摸事件,后续的一系列事件都由它来处理,当滑动控件到顶端的时候,滑动事件都被下拉刷新控件消费掉了,传递不到它的子控件

Android自定义控件实现简单的轮播图控件_Android

最近要做一个轮播图的效果,网上看了几篇文章,基本上都能找到实现,效果还挺不错,但是在写的时候感觉每次都要单独去重新在Activity里写一堆代码.于是自己封装了一下.本篇轮播图实现原理原文出处:循环广告位组件的实现,这里只是做了下封装成一个控件,不必每次重复写代码了. 效果图: 实现分析 轮播图的功能就是实现左右滑动的广告.图片信息展示,那我们就用ViewPager来实现,由于考虑到用户体验,我们还需要在下面加一个指示器来标示滑动到了第几张轮播图.指示器我们可以用一个线性布局来根据要展示的轮播图

Android编程获取屏幕宽高与获取控件宽高的方法_Android

本文实例讲述了Android编程获取屏幕宽高与获取控件宽高的方法.分享给大家供大家参考,具体如下: 获取屏幕宽高 // 获取屏幕宽高(方法1) int screenWidth = getWindowManager().getDefaultDisplay().getWidth(); // 屏幕宽(像素,如:480px) int screenHeight = getWindowManager().getDefaultDisplay().getHeight(); // 屏幕高(像素,如:800p) L

Android控件之使用ListView实现时间轴效果_Android

 实现思路: 该View是通过ListView实现的,通过实体两个字段内容content和时间time来展示每个ListItem 时间轴是使用上面一条线(20dp)和中间一个圆(15dp)和下面一条线(40dp)组装成的 在ListView中,设置其分割线为空,并且没有点击效果 效果图: 步骤一:使用xml画出一个灰色的圆点(time_cycle.xml) <?xml version="1.0" encoding="utf-8"?> <shape

Android开发之无痕过渡下拉刷新控件的实现思路详解

相信大家已经对下拉刷新熟悉得不能再熟悉了,市面上的下拉刷新琳琅满目,然而有很多在我看来略有缺陷,接下来我将说明一下存在的缺陷问题,然后提供一种思路来解决这一缺陷,废话不多说!往下看嘞! 1.市面一些下拉刷新控件普遍缺陷演示 以直播吧APP为例: 第1种情况: 滑动控件在初始的0位置时,手势往下滑动然后再往上滑动,可以看到滑动到初始位置时滑动控件不能滑动. 原因: 下拉刷新控件响应了触摸事件,后续的一系列事件都由它来处理,当滑动控件到顶端的时候,滑动事件都被下拉刷新控件消费掉了,传递不到它的子控件