android rgba 显示_android rgba - CSDN
  • RT,由RGB数据和位图宽高构建位图对象并显示出来 适合将解码得到的数据显示在屏幕上
  • android如何直接将解码出来的yuv显示,目前我在项目中是将yuv转换成rgb565来显示,效率太低了。。。希望高手能给一个可行的方案。。。。
  • 服务端下发的颜色值字符串由于一开始依据 iOS 端的 RGBA 格式,Android 端(Android 使用 ARGB 方式)需要进行兼容,需要对此字符串转换。 举例:RGBA #ABCDEF99 => ARGB #99ABCDEF 方式 ①字符串截取和组合 ...

    若移动端访问不佳,请使用 –> Github版

    背景

    服务端下发的颜色值字符串由于一开始依据 iOS 端的 RGBA 格式,Android 端(Android 使用 ARGB 方式)需要进行兼容,需要对此字符串转换。
    举例:RGBA #ABCDEF99 => ARGB #99ABCDEF

    方式

    ①字符串截取和组合

    String argbStr = rgba.substring(0, 1) + rgba.substring(7, 9) + rgba.substring(1, 7);
    int argb = Color.parseColor(argbStr);
    

    ②转为Char数组,遍历重组

    char[] chars = rgba.toCharArray();
    StringBuilder tempStr = new StringBuilder();
     for (int i = 0; i < chars.length; i++) {
    	if (i == 0) {
    		tempStr.append(chars[0]);
    	} else if (i == 1) {
    		tempStr.append(chars[7]);
    	} else if (i == 2) {
        	tempStr.append(chars[8]);
    	} else {
    		tempStr.append(chars[i - 2]);
    	}
    }
    int argb = Color.parseColor(tempStr.toString());
    

    ③位操作

    int rgba = Color.parseColor(rgbaStr);
    int argb = (rgba >>> 8) | (rgba << (32 - 8));
    

    注意事项:
    rgbaStr 字符的长度为 9 的时候,才需要转换,7 位时只有RGB色值,直接使用 Color.parseColor() 即可。

    Color.parseColor() 使用注意事项:

    1. 可能会抛出 IllegalArgumentException 的异常,使用时可以进行一层封装,对异常进行捕获并记录日志,出现异常时返回一个预设的颜色值。
    2. 未做非空判断,可以先判空处理。

    扩展:ARGB 转 RGBA

    以下算法临时改写而成,未经实际产品应用,建议先跑一些测试用例进行验证。

    // 1. 字符串截取+拼接
    String argbTemp= argbStr.substring(0, 1) + argbStr.substring(3, 9) + argbStr.substring(1, 3);
    int rgba = Color.parseColor(argbTemp);
    
    // 2. 转为Char数组,遍历重组
    char[] chars = argbStr.toCharArray();
                StringBuilder tempStr = new StringBuilder();
                for (int i = 0; i < chars.length; i++) {
                    if (i == 0) {
                        tempStr.append(chars[0]);
                    } else if (i == 7) {
                        tempStr.append(chars[1]);
                    } else if (i == 8) {
                        tempStr.append(chars[2]);
                    } else {
                        tempStr.append(chars[i + 2]);
                    }
                }
     int rgba = Color.parseColor(tempStr.toString());
    // 3. 位操作
    int argb = Color.parseColor(argbStr);
    int rgba = (argb << 8) | (argb >>> (32-8));
    

    如果有什么建议或者问题可以随时联系我,共同探讨学习:

    展开全文
  • android简析YUV转RGBA

    2018-03-26 11:20:03
      android中在做视频开发或相机预览时,参数只能设置为ImageFormat.NV21或者ImageFormat.YV12,设置别的参数摄像头不会打开,实现PreviewCallback接口会获取一个byte[]字节流,获取到的图像数据是YUV格式的。...

      android中在做视频开发或相机预览时,参数只能设置为ImageFormat.NV21或者ImageFormat.YV12,设置别的参数摄像头不会打开,实现PreviewCallback接口会获取一个byte[]字节流,获取到的图像数据是YUV格式的。NV21是YUV420的一种。开发当中有时需要将YUV格式转换为RGBA格式,接下来我们简单分析YUV格式与RGBA格式。

    YUV

      YUV,分为三个分量,“Y”表示明亮度(Luminance或Luma),也就是灰度值;而“U”和“V” 表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。与我们熟知的RGB类似,YUV也是一种颜色编码方法,主要用于电视系统以及模拟视频领域,它将亮度信息(Y)与色彩信息(UV)分离,没有UV信息一样可以显示完整的图像,只不过是黑白的,这样的设计很好地解决了彩色电视机与黑白电视的兼容问题。并且,YUV不像RGB那样要求三个独立的视频信号同时传输,所以用YUV方式传送占用极少的频宽。

    1.采样方式

      YUV码流的存储格式其实与其采样的方式密切相关,主流的采样方式有三种,YUV4:4:4,YUV4:2:2,YUV4:2:0,如何根据其采样格式来从码流中还原每个像素点的YUV值,因为只有正确地还原了每个像素点的YUV值,才能通过YUV与RGB的转换公式提取出每个像素点的RGB值,然后显示出来。

    用三个图来直观地表示采集的方式吧,以黑点表示采样该像素点的Y分量,以空心圆圈表示采用该像素点的UV分量。

    先记住下面这段话,以后提取每个像素的YUV分量会用到。

    YUV 4:4:4采样,每一个Y对应一组UV分量,每像素32位。

    YUV 4:2:2采样,每两个Y共用一组UV分量,每像素16位。

    YUV 4:2:0采样,每四个Y共用一组UV分量,每像素16位。

    平常所讲的YUV A:B:C的意思一般是指基于4个象素来讲,其中Y采样了A次,U采样了B次,V采样了C次。

    2. 存储方式

      YUV420P(I420)三个分量顺序是Y、U、V。YV12三个分量的顺序是Y、V、U。NV21是按YUV 4:2:0抽样的。即对于一张图片的每一个像素,完整保留其Y分量,而对于U和V分量,以2X2的像素块比例采样。其中Y分量按平面存储,U和V则交错打包存储。NV12和NV21都是Y分量在前,U和V分量打包在后。不同处在于NV12是按UV顺序打包,而NV21是按VU顺序打包的。

    I420

    I420

    YV12

    YV12

    NV12

    NV12

    RGB

      RGB 色彩模式是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是目前运用最广的颜色系统之一。ARGB 是一种色彩模式,也就是RGB色彩模式附加上Alpha(透明度)通道,常见于32位位图的存储结构。RGBA又可以称为 ARGB,是Alpha(透明度),Red,Green,Blue组成的色彩空间。但ARGB也可以指Adobe RGB色彩空间。

    RGB565 每个像素用16位表示,RGB分量分别使用5位、6位、5位

    RGB555 每个像素用16位表示,RGB分量都使用5位(剩下1位不用)

    RGB24 每个像素用24位表示,RGB分量各使用8位

    RGB32 每个像素用32位表示,RGB分量各使用8位(剩下8位不用)

    ARGB32 每个像素用32位表示,RGB分量各使用8位(剩下的8位用于表示Alpha通道值)

    YUV转化RGBA

    NV21转化RGBA(有待考证!!)

    如图,NV21的图与此图中的uv顺序相反

    R = Y1 + 1.370705 * ( V1 - 128 );

    G = Y1 - 0.698001 * ( U1 - 128 ) - 0.703125 * (V1 - 128);

    B = Y1 + 1.732446 * ( U1 - 128 );

    java实现

    public byte[] NV21toRGBA(byte[] data, int width, int height) {
        int size = width * height;
        byte[] bytes = new byte[size * 4];
        int y, u, v;
        int r, g, b;
        int index;
        for (int i = 0; i < height; i++) {
            for (int j = 0; j < width; j++) {
                index = j % 2 == 0 ? j : j - 1;
    
                y = data[width * i + j] & 0xff;
                u = data[width * height + width * (i / 2) + index + 1] & 0xff;
                v = data[width * height + width * (i / 2) + index] & 0xff;
    
                r = y + (int) 1.370705f * (v - 128);
                g = y - (int) (0.698001f * (v - 128) + 0.337633f * (u - 128));
                b = y + (int) 1.732446f * (u - 128);
    
                r = r < 0 ? 0 : (r > 255 ? 255 : r);
                g = g < 0 ? 0 : (g > 255 ? 255 : g);
                b = b < 0 ? 0 : (b > 255 ? 255 : b);
    
                bytes[width * i * 4 + j * 4 + 0] = (byte) r;
                bytes[width * i * 4 + j * 4 + 1] = (byte) g;
                bytes[width * i * 4 + j * 4 + 2] = (byte) b;
                bytes[width * i * 4 + j * 4 + 3] = (byte) 255;//透明度
            }
        }
        return bytes;
    }

    jni实现

    JNIEXPORT void JNICALL
    Java_seetaface_JniClient_YUV2RGBA
            (JNIEnv *env, jobject obj, jbyteArray v_yuv_data,
             jbyteArray v_rgba_data, jint width, jint height) {
    
        jbyte *tYUVData = env->GetByteArrayElements(v_yuv_data, 0);
        jbyte *tRGBData = env->GetByteArrayElements(v_rgba_data, 0);
        int length = width * height * 4;
        jbyte yValue, vValue, uValue;
        int index;
        int r, g, b;
    
        for (int i = 0; i < height; i++) {
            for (int j = 0; j < width; j++) {
                index = j % 2 == 0 ? j : j - 1;
    
                yValue = tYUVData[width * i + j];
                vValue = tYUVData[width * height + width * (i / 2) + index];
                uValue = tYUVData[width * height + width * (i / 2) + index + 1];
    
                r = yValue + (1.370705 * (vValue - 128));
                g = yValue - (0.698001 * (vValue - 128)) - (0.337633 * (uValue - 128));
                b = yValue + (1.732446 * (uValue - 128));
    
                r = r < 0 ? 0 : (r > 255 ? 255 : r);
                g = g < 0 ? 0 : (g > 255 ? 255 : g);
                b = b < 0 ? 0 : (b > 255 ? 255 : b);
    
                tRGBData[width * i * 4 + j * 4 + 0] = r;
                tRGBData[width * i * 4 + j * 4 + 1] = g;
                tRGBData[width * i * 4 + j * 4 + 2] = b;
                tRGBData[width * i * 4 + j * 4 + 3] = 255;
            }
        }
        jbyte *buf = (jbyte *) malloc(length);
        memcpy(buf, tRGBData, length);
        env->SetByteArrayRegion(v_rgba_data, 0, length, buf);
        free(buf);
    }

    jni耗时比java要久一些,个人觉得jni代码有问题,对c语言不是很熟悉,望大家指出错误。

    参考:

    1.https://www.cnblogs.com/silence-hust/p/4465354.html

    2.http://doc.okbase.net/raomengyang/archive/186891.html

    展开全文
  • RGBA转换成RGB

    2016-01-20 21:37:20
    刚毕业半年,毕业才开始接触UI,现在的系统支持RGB模式显示,但是需要RGBA透明色来描边,所以粗略学习了下。 个人理解RGBA中的A是相对的,也就是一个背景色。 所以假设背景颜色的值为(bg.r, bg.g, bg.b), 而...

    刚毕业半年,毕业才开始接触UI,现在的系统支持RGB模式显示,但是需要RGBA透明色来描边,所以粗略学习了下。


    个人理解RGBA中的A是相对的,也就是一个背景色。


    所以假设背景颜色的值为(bg.r, bg.g, bg.b),


    而需要设置的透明色(RGBA模式)为(color.r, color.g, color.b, a)           a为小数


    目标值转换成RGB模式为    R = (1 - a) * bg.r + a * color.r

        G = (1 - a) * bg.g + a * color.g

                                                B = (1 - a) * bg.b + a * color.b

    当a = 1时,为完全不透明;

    当a = 0时,为完全透明,即背景色


    翻墙搜到的一个在线转换,还有颜色显示,通俗易懂:

    http://yolijn.com/convert-rgba-to-rgb

              

    展开全文
  • RGBA格式转BufferedImage的实现 /** * 从RGBA格式图像矩阵数据创建一个BufferedImage * @param matrixRGBA RGBA格式图像矩阵数据,为null则创建一个指定尺寸的空图像 * @param width * @param height...

    从RGBA格式转BufferedImage的实现如下,注意,这个实现实际只保留了,Red,Green,Blue三个颜色通道数据,删除了alpha通道。

    	/**
    	 * 从RGBA格式图像矩阵数据创建一个BufferedImage
    	 * @param matrixRGBA RGBA格式图像矩阵数据,为null则创建一个指定尺寸的空图像
    	 * @param width
    	 * @param height
    	 * @return
    	 */
    	public static BufferedImage createRGBAImage(byte[] matrixRGBA,int width,int height){
    		// 定义每像素字节数
    		int bytePerPixel = 4;
    		
    		if(null != matrixRGBA&&matrixRGBA.length == width*height*bytePerPixel){
    			throw new IllegalArugmentException("invalid image description");
    		}
    		// 将图像数据byte[]封装为DataBuffer
    	    DataBufferByte dataBuffer = null == matrixRGBA ? null : new DataBufferByte(matrixRGBA, matrixRGBA.length);
    	    // 定义色彩空间 sRGB
    	    ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_sRGB);
    	    int[] bOffs = {0,1,2};
    	    // 根据色彩空间创建色彩模型(ColorModel实例),bOffs用于定义R,G,B三个分量在每个像素数据中的位置
    	    ComponentColorModel colorModel = new ComponentColorModel(cs, false, false,
    	                                         Transparency.OPAQUE,
    	                                         DataBuffer.TYPE_BYTE);
    	    // 从DataBuffer创建光栅对象Raster   
    	    WritableRaster raster = null != dataBuffer
    	    		? Raster.createInterleavedRaster(dataBuffer, width, height, width*bytePerPixel, bytePerPixel, bOffs, null)
    	    		: Raster.createInterleavedRaster(DataBuffer.TYPE_BYTE, width, height,width*bytePerPixel, bytePerPixel, bOffs, null);
    	    BufferedImage img = new BufferedImage(colorModel,raster,colorModel.isAlphaPremultiplied(),null);
    	    return  img;	    
    	}
    
    展开全文
  • 在上一篇文章《Android使用ffmpeg解码视频为YUV》中我们已经使用ffmpeg解码视频为yuv数据文件了,那么yuv数据如何显示呢? 不知道大家是否还记得这张图: 其中一种显示方案就是将YUV转换为rgb,然后通过surfaceView...

    在上一篇文章《Android使用ffmpeg解码视频为YUV》中我们已经使用ffmpeg解码视频为yuv数据文件了,那么yuv数据如何显示呢?
    不知道大家是否还记得这张图:
    音视频的格式内容

    其中一种显示方案就是将YUV转换为rgb,然后通过surfaceView绘制显示。

    那么如何将yuv转换成RGB呢?这是有特定的转换公式的,笔者在音视频基础知识-YUV图像一文中有说过。
    但是在这里并不用并不用我们手动去转换,我们可以通过调用ffmpeg内置的api很方便地完成转换,而且还可以改变画面的宽高等等。

    首先我们创建一个播放器的View继承于SurfaceView:

    public class FlyPlayer extends SurfaceView implements SurfaceHolder.Callback,Runnable {
    
        public FlyPlayer(Context context, AttributeSet attrs) {
            super(context, attrs);
            //设置callback
            getHolder().addCallback(this);
        }
    
        @Override
        public void surfaceCreated(SurfaceHolder surfaceHolder) {
            // 开启线程
            new Thread(this).start();
        }
    
        @Override
        public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {
    
        }
    
        @Override
        public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
    
        }
    
        @Override
        public void run() {
    
            playVideo("/sdcard/Download/video.mp4",getHolder().getSurface());
        }
    
    
        public native void playVideo(String videoPath, Surface surface);
    }
    
    

    native绘制代码:

    
    extern "C"
    JNIEXPORT void JNICALL
    Java_com_flyer_ffmpeg_FlyPlayer_playVideo(JNIEnv *env, jobject thiz, jstring video_path,
                                              jobject surface) {
        const char *path = env->GetStringUTFChars(video_path, 0);
    
        AVFormatContext *fmt_ctx;
        // 初始化格式化上下文
        fmt_ctx = avformat_alloc_context();
    
        // 使用ffmpeg打开文件
        int re = avformat_open_input(&fmt_ctx, path, nullptr, nullptr);
        if (re != 0) {
            LOGE("打开文件失败:%s", av_err2str(re));
            return;
        }
    
        //探测流索引
        re = avformat_find_stream_info(fmt_ctx, nullptr);
    
        if (re < 0) {
            LOGE("索引探测失败:%s", av_err2str(re));
            return;
        }
    
        //寻找视频流索引
        int v_idx = av_find_best_stream(
                fmt_ctx, AVMEDIA_TYPE_VIDEO, -1, -1, nullptr, 0);
    
        if (v_idx == -1) {
            LOGE("获取视频流索引失败");
            return;
        }
        //解码器参数
        AVCodecParameters *c_par;
        //解码器上下文
        AVCodecContext *cc_ctx;
        //声明一个解码器
        const AVCodec *codec;
    
        c_par = fmt_ctx->streams[v_idx]->codecpar;
    
        //通过id查找解码器
        codec = avcodec_find_decoder(c_par->codec_id);
    
        if (!codec) {
    
            LOGE("查找解码器失败");
            return;
        }
    
        //用参数c_par实例化编解码器上下文,,并打开编解码器
        cc_ctx = avcodec_alloc_context3(codec);
    
        // 关联解码器上下文
        re = avcodec_parameters_to_context(cc_ctx, c_par);
    
        if (re < 0) {
            LOGE("解码器上下文关联失败:%s", av_err2str(re));
            return;
        }
    
        //打开解码器
        re = avcodec_open2(cc_ctx, codec, nullptr);
    
        if (re != 0) {
            LOGE("打开解码器失败:%s", av_err2str(re));
            return;
        }
    
        //数据包
        AVPacket *pkt;
        //数据帧
        AVFrame *frame;
    
        //初始化
        pkt = av_packet_alloc();
        frame = av_frame_alloc();
    
    
        //初始化像素格式转换的上下文
        SwsContext *vctx = NULL;
        int outWidth = 1920;
        int outHeight = 1080;
        char *rgb = new char[outWidth * outHeight * 4];
        char *pcm = new char[48000 * 4 * 2];
    
        //显示窗口初始化
        ANativeWindow *nwin = ANativeWindow_fromSurface(env, surface);
        ANativeWindow_setBuffersGeometry(nwin, outWidth, outHeight, WINDOW_FORMAT_RGBA_8888);
        ANativeWindow_Buffer wbuf;
    
        while (av_read_frame(fmt_ctx, pkt) >= 0) {//持续读帧
            // 只解码视频流
            if (pkt->stream_index == v_idx) {
    
                //发送数据包到解码器
                avcodec_send_packet(cc_ctx, pkt);
    
                //清理
                av_packet_unref(pkt);
    
                //这里为什么要使用一个for循环呢?
                // 因为avcodec_send_packet和avcodec_receive_frame并不是一对一的关系的
                //一个avcodec_send_packet可能会出发多个avcodec_receive_frame
                for (;;) {
                    // 接受解码的数据
                    re = avcodec_receive_frame(cc_ctx, frame);
                    if (re != 0) {
                        break;
                    } else {
    
                        // 将YUV数据转换成RGB数据显示
    
                        vctx = sws_getCachedContext(vctx,
                                                    frame->width,
                                                    frame->height,
                                                    (AVPixelFormat) frame->format,
                                                    outWidth,
                                                    outHeight,
                                                    AV_PIX_FMT_RGBA,
                                                    SWS_FAST_BILINEAR,
                                                    0, 0, 0
                        );
                        if (!vctx) {
                            LOGE("sws_getCachedContext failed!");
                        } else {
                            uint8_t *data[AV_NUM_DATA_POINTERS] = {0};
                            data[0] = (uint8_t *) rgb;
                            int lines[AV_NUM_DATA_POINTERS] = {0};
                            lines[0] = outWidth * 4;
                            int h = sws_scale(vctx,
                                              (const uint8_t **) frame->data,
                                              frame->linesize, 0,
                                              frame->height,
                                              data, lines);
                            LOGE("sws_scale = %d", h);
                            if (h > 0) {
                                // 绘制
                                ANativeWindow_lock(nwin, &wbuf, 0);
                                uint8_t *dst = (uint8_t *) wbuf.bits;
                                memcpy(dst, rgb, outWidth * outHeight * 4);
                                ANativeWindow_unlockAndPost(nwin);
                            }
                        }
    
                    }
                }
    
            }
        }
        //关闭环境
        avcodec_free_context(&cc_ctx);
        // 释放资源
        av_frame_free(&frame);
        av_packet_free(&pkt);
    
        avformat_free_context(fmt_ctx);
    
        LOGE("播放完毕");
    
        env->ReleaseStringUTFChars(video_path, path);
    }
    

    通过注释以及和《Android使用ffmpeg解码视频为YUV》一文的解码主要代码对比,我们增加的代码并不多,仅仅是增加了像素格式转换以及ANativeWindow初始化以及绘制的代码。大家结合注释不难看懂。

    运行测试一下我们的代码能否播放视频:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mmESwDUd-1583019691266)(https://flyer-blog.oss-cn-shenzhen.aliyuncs.com/解码播放测试.gif)]

    最后如果你对音视频开发感兴趣可扫码关注,笔者在各个知识点学习完毕之后也会使用ffmepg从零开始编写一个多媒体播放器,包括本地播放及网络流播放等等。欢迎关注,后续我们共同探讨,共同进步。

    展开全文
  • rgba与16进制互相转换

    2017-05-15 15:39:34
    之前项目中有用到颜色选择器插件,插件是16仅进制的,但是我们显示的时候要显示rgba格式,需要一个透明度,下面分享自己整理的rgba和16进制转换的方法。 // 16进制转换成rgba 'hexToRgb' : function(hex) { ...
  • 博主声明: 转载请在开头附加本文链接及作者信息,并标记为转载。... Android UI 中最离不开的就是图片了,图片可以由很多种格式构成,比如 png、jpeg、webp 格式等等。我们有时候会发现同一张的图片却有不同的大...
  • 最近一段时间因为工作的需要,要使用到libyuv。因为之前写录制视频的时候,也要用到rgb...RGBA系列首先就是rgba系列的格式,RGBA色彩主要用于色彩的显示和描述。常见的有RGBA/ARGB/BGRA/ABGR/RGB/BGR。这些格式都比较好
  • 什么是ImageVIew:是显示图片的一个控件 ImageView属性: android:src=“@drawable/ic_launcher”—ImageView的内容图像 android:background=@drawable/ic_launcher—ImageView背景图像 android:background=”#00ff...
  •  前一篇文章讲述了Android拍照、截图、保存并显示在ImageView控件中,该篇文章继续讲述Android图像处理技术,主要操作包含:通过打开相冊里的图片,使用Matrix对图像进行缩放、旋转、移动、对照度、亮度、饱和度操作,...
  • android中surfaceView的使用
  • RGBA数据转存BMP图片

    2020-07-30 23:32:07
    RGBA数据转存BMP图片。。。。。。。。。。。。。。。。。。。。 只有一个头文件,3个函数,包含使用即可。。。。。。。。。。。。。。。。。。
  • opengl中的RGBA颜色

    2013-07-17 14:25:26
    RGBA模式中,每一个像素会保存以下数据:R值(红色分量)、G值(绿色分量)、B值(蓝色分量)和A值(alpha分量)。其中红、绿、蓝三种颜色相组合,就可以得到我们所需要的各种颜色,而alpha不直接影响颜色,它将留待...
  • 在上一篇文章中,我们知道了如何在Android开发一个OpenGL模型显示。但是并没有对具体模型数据进行显示,只是展示一个背景颜色而已,在本章中,我们学习如何将一个模型数据显示成一个具体的3D图形。在Android中开发...
  • Android Bitmap 的优化

    2020-07-04 17:02:47
    Android 中的图片是以 Bitmap 方式存在的,绘制的时候也是 Bitmap,直接影响到app运行时的内存。通过 ImageView 来显示图片,很多时候 ImageView 并没有原始图片的尺寸那么大,这个时候把整个图片加载进来后再设置给...
  • Action Bar是一种新増的导航栏功能,在Android 3.0之后加入到系统的API当中,它标识了用户当前操作界面的位置,并提供了额外的用户动作、界面导航等功能。使用ActionBar的好处是,它可以给提供一种全局统一的UI界面...
  • 以下在Android 4.4平台开发测试, #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include ...
  • 一,同样的,利用封装好的库收集图像 package ...import android.app.Activity; import android.graphics.Bitmap; import android.os.Bundle; import android.view.SurfaceView; import androi
1 2 3 4 5 ... 20
收藏数 8,364
精华内容 3,345
关键字:

android rgba 显示