zoukankan      html  css  js  c++  java
  • Android中bitmap图片透明度的处理(以撕美女衣服为例)

    原理介绍:将两种不同效果的图片放在相同的位置,改变上面的图片的透明度,就能实现了。

    布局文件:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        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:paddingBottom="@dimen/activity_vertical_margin"
        tools:context=".MainActivity">
    
        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:id="@+id/iv_bottom" />
    
        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:id="@+id/iv_top" />
    </RelativeLayout>

    MainActivity

    package cn.seanlou.stripclothes;
    
    import android.app.Activity;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.MotionEvent;
    import android.view.View;
    import android.widget.ImageView;
    
    
    public class MainActivity extends Activity {
        private ImageView ivBottom;
        private ImageView ivTop;
        private Bitmap imgBlank;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            findView();
            init();
        }
    
        /**
         * 初始化控件内容
         */
        private void init() {
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inSampleSize = 1;
            //获取显示在上面的图片,BitmapFactory.decodeResource()方法获取到的图片编码是RGB格式的,需要转换成ARGB格式的。
            Bitmap imgTop = BitmapFactory.decodeResource(getResources(), R.mipmap.g1_up, options);
            //获取显示在下面的图片。
            Bitmap imgBottom = BitmapFactory.decodeResource(getResources(), R.mipmap.g1_back, options);
            //创建一个显示在上面的图片imgTop大小的空白Bitmap图片,图片格式设置成ARGB格式的。
            imgBlank = Bitmap.createBitmap(imgTop.getWidth(), imgTop.getHeight(), Bitmap.Config.ARGB_4444);
            //将imgBlank创建为画布。
            Canvas canvas = new Canvas(imgBlank);
            //将imgTop画在画布上
            canvas.drawBitmap(imgTop, 0, 0, null);
    
            ivTop.setImageBitmap(imgBlank);
            ivBottom.setImageBitmap(imgBottom);
    
            ivTop.setOnTouchListener(new MyOnTouchListener());
        }
    
        private void findView() {
            ivTop = (ImageView) findViewById(R.id.iv_top);
            ivBottom = (ImageView) findViewById(R.id.iv_bottom);
        }
    
        private class MyOnTouchListener implements View.OnTouchListener {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (event.getAction() == MotionEvent.ACTION_MOVE) {
    
                    int x = (int) event.getX();
                    int y = (int) event.getY();
                    Log.i("location", "当前位置 x:" + x + ",y:" + y);
                    for (int i = x - 20; i < x + 20; i++) {
                        for (int j = y - 20; j < y + 20; j++) {
                            //处理图片边界问题
                            if (i >= 0 && i < imgBlank.getWidth() && j >= 0 && j < imgBlank.getHeight()) {
                                //设置当前点为透明
                                imgBlank.setPixel(i, j, Color.TRANSPARENT);
                            }
                        }
                    }
                    //显示图片
                    ivTop.setImageBitmap(imgBlank);
                }
                return true;
            }
        }
    }
  • 相关阅读:
    【C++】对象模型
    【C++多线程】读写锁shared_lock/shared_mutex
    【C++多线程】共享数据的初始化保护
    【C++多线程】共享数据保护
    【C++多线程】lock_guard<T>类和unique_lock<T>类
    【C++多线程】转移线程所有权
    【C++ 】std::ref()和std::cref()
    【C++多线程】传递参数
    【C++多线程】detach()及注意
    linux 打开CHM文件
  • 原文地址:https://www.cnblogs.com/louguanyang/p/4425059.html
Copyright © 2011-2022 走看看