ViewPage + DialogFragment + Bitmap项目实战

前期知识

Android自定义轮播效果

ViewPager一屏多页面显示两侧无触摸/滑动事件

ViewPage实现一屏多页面显示(进阶版)

DialogFragment的简单使用

效果展示

 实现思路

1、利用  FrameLayout 父布局中 压两层  ImageView (穿衣服的在上面、mei穿衣服的在下面)

2、监听 上层 ImageView onTouch 事件,当手指在上面移动时,以手指为基准 将40*40像素大小的像素点 设置为透明。

注意点:BitmapFactory.decodeResource 获取的图片是 只读 的,要复制一份之后 才能进行可修改操作,要不然会报错的。

报错如下图所示:

xml布局代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="30dp"
        android:text="摸我试试"
        android:gravity="center"
        android:textColor="@color/aqua"
        android:layout_margin="20dp"/>
    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

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

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

    <ImageView
        android:id="@+id/iv_close"
        android:layout_width="match_parent"
        android:layout_height="30dp"
        android:src="@drawable/close"
        android:layout_margin="20dp"/>

</LinearLayout>

 java逻辑代码

package com.wust.mydialog;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ImageView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.DialogFragment;

/**
 * ClassName: MyShowPhotoFragment <br/>
 * Description: <br/>
 * date: 2021/8/9 12:35<br/>
 *
 * @author yiqi<br />
 * @QQ 1820762465
 * @微信 yiqiideallife
 * @技术交流QQ群 928023749
 */
public class MyShowPhotoFragment extends DialogFragment {

    private View mRootView;
    private ImageView iv_close;
    private ImageView iv_show_after;
    private ImageView iv_show_before;
    private int mCurNum;
    private int[] mImgData;
    private int[] mImgDataAfter;
    private Bitmap before_up_bm;

    public void setPhotoNum(int[] imgData,int[] imgDataAfter,int num) {
        this.mImgDataAfter = imgDataAfter;
        this.mImgData = imgData;
        this.mCurNum = num;
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        mRootView = getLayoutInflater().inflate(R.layout.photo_fragment, null, false);
        initBitmap();
        bindView();
        bindData();
        return mRootView;
    }

    private void initBitmap() {
        //这个获取的是只读的
        Bitmap before = BitmapFactory.decodeResource(getResources(), mImgData[mCurNum]);
//        Bitmap bitmap = Bitmap.createBitmap(before.getWidth(), before.getHeight(), Bitmap.Config.ARGB_8888);
        //所以需要复制一份 bm
        before_up_bm = before.copy(Bitmap.Config.ARGB_8888, true);

    }

    private void bindView() {
        iv_close = mRootView.findViewById(R.id.iv_close);
        iv_show_after = mRootView.findViewById(R.id.iv_show_after);
        iv_show_before = mRootView.findViewById(R.id.iv_show_before);
    }

    private void bindData() {
        iv_show_before.setImageResource(mImgData[mCurNum]);
        iv_show_before.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()){
                    case MotionEvent.ACTION_MOVE:
                    {
                        int newX = (int) event.getX();
                        int newY = (int) event.getY();
                        System.out.println(" newX -> " + newX + " newY -> " + newY);
                        for (int i = -20; i < 20; i++) {
                            for (int j = -20; j < 20; j++){
                                if (i+newX>0&&i+newX<before_up_bm.getWidth()&&j+newY>0&&j+newY<before_up_bm.getHeight()){
                                    // setPixel() 设置像素的方法
                                    before_up_bm.setPixel(newX+i,newY+j, Color.TRANSPARENT);
                                }
                            }
                        }
                    }
                    break;
                }
                iv_show_before.setImageBitmap(before_up_bm);
                return true;
            }
        });
        iv_show_after.setImageResource(mImgDataAfter[mCurNum]);
        iv_close.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dismiss();
            }
        });
    }

}

项目完整代码:gitee.com

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
ViewPage FragmentAndroid 中的一个工具类,用于在一个 Activity 中显示多个 Fragment,并且可以通过滑动来切换不同的 Fragment。仿微信的话,可以使用 ViewPage Fragment 来实现类似微信的主界面,其中每个 Fragment 分别对应微信的不同功能模块。 首先,我们可以创建一个主界面的 Activity,该 Activity 包含一个 ViewPage,用于显示不同的 Fragment。然后,创建多个 Fragment,每个 Fragment 分别负责显示微信的不同功能模块,比如聊天列表、联系人列表、发现等。 在每个 Fragment 中,可以使用 RecyclerView 来展示列表数据,并根据不同的业务需求进行相应的逻辑处理。比如,在聊天列表中,可以显示每个聊天会话的头像、昵称、最近一条消息等信息,并通过点击监听实现跳转到聊天界面的功能。 另外,可以为每个 Fragment 添加相应的菜单选项,仿微信的底部导航栏,用于在不同的 Fragment 之间进行切换。通过监听导航栏的点击事件,并配合 ViewPage 的滑动,可以实现类似微信的切换效果。 此外,可以通过 FragmentManager 来管理 Fragment 的生命周期,并实现 Fragment 之间的通信。比如,在聊天界面中发送一条消息后,可以通过调用 FragmentManager 的方法刷新聊天列表界面,并更新最近一条消息的显示。 总而言之,使用 ViewPage Fragment 可以很方便地实现一个仿微信的界面,通过不同的 Fragment 展示不同的功能模块,使用户可以在同一个 Activity 中进行多个功能的切换和操作。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

super码王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值