当前位置: 搜索的结果

聊天APP界面中的表情用ViewPager实现

聊天APP界面中的表情,自定义EmojiconTextView,和EmojiconEditText和一个表情EmojiconsFragment实现。
其中表情页面用ViewPager实现多个页面的,其中自定义EmojisPagerAdapter并且提供两个方法:
    @Override
    public void onEmojiconClicked(Emojicon emojicon) {
        EmojiconsFragment.input(editEmojicon, emojicon);
    }

    @Override
    public void onEmojiconBackspaceClicked(View v) {
        EmojiconsFragment.backspace(editEmojicon);
    }

一个输入内容的,一个返回软键盘。自定义EmojiconGridFragment实现gridview效果。
使用的时候很方便直接引入库就可以了。

 

viewpager切换添加动画效果

viewpager切换添加动画效果,本项目中主要有三种切换特效,
(1):DepthPageTransformer 效果
(2):RotateDownPageTransformer 每一个view切换的时候旋转
(3):ZoomOutPageTransformer 效果
主要实现代码:
  mViewPager.setPageTransformer(true,new ZoomOutPageTransformer());
  mViewPager.setPageTransformer(true,new RotateDownPageTransformer());
  mViewPager.setPageTransformer(true,new DepthPageTransformer());
这三句实现这三个效果,其中每一个类都封装好了,直接可以使用。

ViewPage滑动加载大图和点击关注效果

ViewPage滑动加载大图和点击关注效果,viewpager滑动页面加载多张图片效果,
和点击关注按钮时候的状态变化效果。
本项目来源:https://github.com/SerhatSurguvec/Double-Tap-To-Like
大体实现代码:ViewPagerAdapter里面主要实现。

//ViewPager
public class ViewPagerAdapter extends PagerAdapter {
    // Declare Variables
    Context context;
    LayoutInflater inflater;
    int[] images;

    public ViewPagerAdapter(Context context, int[] images) {
        this.context = context;
        this.images = images;
    }

    @Override
    public int getCount() {
        return 5;
    }

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

    @Override
    public Object instantiateItem(ViewGroup container, int position) {

        ImageView imageview;
        final ImageView heartAnim;
        final ImageView likeImg;
        final TextView likeCount;
        TextView whichOfThem;

        inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View itemView = inflater.inflate(R.layout.viewpager_item, container,
                false);


        // Locate the ImageView in viewpager_item.xml
        imageview = (ImageView) itemView.findViewById(R.id.image);
        heartAnim = (ImageView) itemView.findViewById(R.id.heart_anim);
        likeImg = (ImageView) itemView.findViewById(R.id.item_comment_like_img);
        likeCount = (TextView) itemView.findViewById(R.id.item_comment_like_count);
        whichOfThem = (TextView) itemView.findViewById(R.id.which);

        whichOfThem.setText((position + 1) + "/" + 5);
        imageview.setImageResource(images[position]);

        final GestureDetector gd = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
            @Override
            public boolean onDown(MotionEvent e) {
                return true;
            }

            @Override
            public boolean onDoubleTap(MotionEvent e) {

                Animation pulse_fade = AnimationUtils.loadAnimation(context, R.anim.pulse_fade_in);
                pulse_fade.setAnimationListener(new Animation.AnimationListener() {
                    @Override
                    public void onAnimationStart(Animation animation) {
                        heartAnim.setVisibility(View.VISIBLE);
                    }

                    @Override
                    public void onAnimationEnd(Animation animation) {
                        heartAnim.setVisibility(View.GONE);
                    }

                    @Override
                    public void onAnimationRepeat(Animation animation) {

                    }
                });
                heartAnim.startAnimation(pulse_fade);
                likeImg.setImageDrawable(context.getResources().getDrawable(R.drawable.like_active));
                likeCount.setText("3 Likes");
                return true;
            }

            @Override
            public void onLongPress(MotionEvent e) {
                super.onLongPress(e);

            }

            @Override
            public boolean onDoubleTapEvent(MotionEvent e) {
                return true;
            }
        });

        imageview.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {

                return gd.onTouchEvent(event);
            }
        });


        // Add viewpager_item.xml to ViewPager
        (container).addView(itemView);

        return itemView;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        // Remove viewpager_item.xml from ViewPager
        ((ViewPager) container).removeView((RelativeLayout) object);

    }
}


 

ScrollDownLayout ScrollView和viewpager同事存在的事件处理

ScrollDownLayout ScrollView和viewpager同事存在的事件处理,并且很好的处理事件问题,
本项目通过自定义ScrollDownLayout和ContentScrollView来处理的,里面嵌入ViewPager。
支持手势下滑退出页面 ,
主要代码如下:
{
 ViewPager viewPager = (ViewPager) findViewById(R.id.view_pager);
        mGirlDesText = (TextView)findViewById(R.id.text_view);
        mScrollDownLayout = (ScrollDownLayout) findViewById(R.id.scroll_down_layout);

        mScrollDownLayout.setMinOffset(0);
        mScrollDownLayout.setMaxOffset(800);
        mScrollDownLayout.setExitOffset(1674);
        mScrollDownLayout.setToOpen();
        mScrollDownLayout.setIsSupportExit(true);
        mScrollDownLayout.setAllowHorizontalScroll(true);
        mScrollDownLayout.setOnScrollChangedListener(mOnScrollChangedListener);

        MainPagerAdapter mainPagerAdapter = new MainPagerAdapter(this);
        mainPagerAdapter.setOnClickItemListener(mOnClickItemListener);
        viewPager.setAdapter(mainPagerAdapter);
        viewPager.setOnPageChangeListener(mOnPageChangeListener);
        initGirlUrl();
        mainPagerAdapter.initViewUrl(mAllGirlList);
        mGirlDesText.setText(mAllGirlList.get(0).getDesContent());

 }

 private void initGirlUrl() {
        mAllGirlList = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            Girl girl = new Girl();
            girl.setImageUrl(Contstants.ImageUrl[i]);
            girl.setDesContent(Contstants.DesContent[i]);
            mAllGirlList.add(girl);
        }
    }

android listview中item通过viewpager实现

android listview中item通过viewpager实现,每一个item都支持viewpager实现图片切换功能。本项目主要介绍多个viewpager加载图片和listview 上下滑动不卡顿问题。本项目由作者Flyco分享的
分享地址:https://github.com/H07000223/FlycoBanner_Master。
本项目找对应id封装一个ViewFindUtils类,通过如下代码找id
    /**
     * 替代findviewById方法
     */
    public static <T extends View> T find(View view, int id)
    {
        return (T) view.findViewById(id);
    }

查找调用:
        ViewFindUtils.find(decorView, R.id.tv_select_transformer).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                showSelectDialog(false);
            }
        });

ViewPager实现欢迎页面动画效果

ViewPager实现欢迎页面动画滑动切换view效果,页面切换添加优美的动画,
对学习android 动画的朋友可以研究研究,
本项目主要代码ViewPager 和ScreenSlidePagerAdapter实现,其中ScreenSlidePagerAdapter的getItem()
方法中通过ScreenSlideFragment实现每一个view效果 ,对切换view的时候自定义SunMoonView 动画页面
继承View,之中主要代码如下:
本项目来源:https://github.com/rahulrj/YahooNewsOnboarding

public void animateSecondScreenClock(float position) {

        if (mCurrentDirection == Path.Direction.CCW) {
            mCurrentDirection = Path.Direction.CW;
            //animPath.reset();
            initNewPath(Path.Direction.CW);
            invalidate();
        }

        if (Math.abs(position) > 1) {
            mDistance = mPathLength / 2 * (Math.abs(position));
        } else {

            mDistance = mPathLength / 2 * (Math.abs(position));
        }
        invalidate();
    }

    public void animateSecondScreenAntiClock(float position) {

        if (mCurrentDirection == Path.Direction.CW) {
            mCurrentDirection = Path.Direction.CCW;
            initNewPath(Path.Direction.CCW);
            invalidate();
        }

        if (Math.abs(position) > 1) {

        } else {

            mDistance = mPathLength / 2 * (Math.abs(1 + position));
        }
        invalidate();


    }
 

FlipViewPager 对item实现左右对折滑动翻页效果

FlipViewPager 对每一条item实现左右对折滑动翻页效果,解决左右滑动和上下滑动的事件分发处理机制。
内部实现如下:用ListView试下,对listview设置adapter,这个adapter继承BaseFlipAdapter<Friend>
,然后对每一个item进行view处理,部分代码如下:
class FriendsAdapter extends BaseFlipAdapter<Friend> {

        private final int PAGES = 3;
        private int[] IDS_INTEREST = {R.id.interest_1, R.id.interest_2, R.id.interest_3, R.id.interest_4, R.id.interest_5};

        public FriendsAdapter(Context context, List<Friend> items, FlipSettings settings) {
            super(context, items, settings);
        }

        @Override
        public View getPage(int position, View convertView, ViewGroup parent, Friend friend1, Friend friend2) {
            final FriendsHolder holder;

            if (convertView == null) {
                holder = new FriendsHolder();
                convertView = getLayoutInflater().inflate(R.layout.friends_merge_page, parent, false);
                holder.leftAvatar = (ImageView) convertView.findViewById(R.id.first);
                holder.rightAvatar = (ImageView) convertView.findViewById(R.id.second);
                holder.infoPage = getLayoutInflater().inflate(R.layout.friends_info, parent, false);
                holder.nickName = (TextView) holder.infoPage.findViewById(R.id.nickname);

                for (int id : IDS_INTEREST)
                    holder.interests.add((TextView) holder.infoPage.findViewById(id));

                convertView.setTag(holder);
            } else {
                holder = (FriendsHolder) convertView.getTag();
            }

            switch (position) {
                // Merged page with 2 friends
                case 1:
                    holder.leftAvatar.setImageResource(friend1.getAvatar());
                    if (friend2 != null)
                        holder.rightAvatar.setImageResource(friend2.getAvatar());
                    break;
                default:
                    fillHolder(holder, position == 0 ? friend1 : friend2);
                    holder.infoPage.setTag(holder);
                    return holder.infoPage;
            }
            return convertView;
        }

        @Override
        public int getPagesCount() {
            return PAGES;
        }

        private void fillHolder(FriendsHolder holder, Friend friend) {
            if (friend == null)
                return;
            Iterator<TextView> iViews = holder.interests.iterator();
            Iterator<String> iInterests = friend.getInterests().iterator();
            while (iViews.hasNext() && iInterests.hasNext())
                iViews.next().setText(iInterests.next());
            holder.infoPage.setBackgroundColor(getResources().getColor(friend.getBackground()));
            holder.nickName.setText(friend.getNickname());
        }

        class FriendsHolder {
            ImageView leftAvatar;
            ImageView rightAvatar;
            View infoPage;

            List<TextView> interests = new ArrayList<>();
            TextView nickName;
        }
    }

 

 

citrus SlidMenu 配合ViewPager实现常用框架

SlidMenu 配合ViewPager实现常用框架,只有滑动切换menu以及左右滑动
home切换viewpager事件冲突解决非常好,是常用的android架构,适合用来搭建框架。

android-sticky-viewpager带有“粘性”功能的viewpager

这是一个带有“粘性”功能的viewpager。

ViewPager带有粘性功能,常规的处理方法可能会超级复杂,因为涉及到大量的onTouch监听、拦截,滑动时因为效率问题影响用户体验,不信你去看一下应用宝、豌豆荚的App详情页,然后滑动一下试试。

但是这个demo却使用了很讨巧的方法,里面很少看到onTouch拦截、事件消费的逻辑处理。细看代码你会发现,这个demo使用了障眼法,很巧妙的障眼法。这个障眼法的灵感,来源于另外一款App的处理逻辑,我在滑动时不小心琢磨到了。我没有去反编译,没有去看代码,却猜到了大体的框架,这真是一件很有意思的事情。

viewpager左右滑动的时候,始终有一个view“粘”在顶部。Viewpager左边fragment是scrollView,右边是listview。左右两个fragment上下滑动的时候,都会计算并动态调整stickyView的位置。在viewpager左右滑动的时候,两个fragment的stickyView高度之间的契合也做了调整。在豌豆荚和应用宝的app详情页界面,对stickyView的处理太过生硬,用户体验不太友好。可以参考这个demo的实现方案。

android SCViewPager 欢迎页面滑动效果

android SCViewPager 欢迎页面滑动效果,支持上下滑动切换页面,页面切换渐变出现下一个页面特效,这充分扩展了ViewPager 的切换页面功能。挺不错的