
privateImageViewimageView,imageView2;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){superonCreate(savedInstanceState);setContentView(Rlayoutactivity_main);imageView=(ImageView)superfindViewById(RidimageView);imageView2=(ImageView)superfindViewById(RidimageView2);//找到你layout中对应的imageViewDrawabledrawable=imageViewgetBackground();//获取它的资源,返回类型是Drawable//假设你想把imageView的设置到其他容器中,比如imageView2,imageView2setBackground(drawable);//imageView2就显示和imageView一样的了}
屏幕的显示机制和帧动画类似,也是一帧一帧的连环画,只不过刷新频率很高,感觉像连续的。为了显示一帧,需要经历计算和渲染两个过程,CPU 先计算出这一帧的图像数据并写入内存,然后调用 OpenGL 命令将内存中数据渲染成图像存放在 GPU Buffer 中,显示设备每隔一定时间从 Buffer 中获取图像并显示。
上述过程中的计算,对于View来说,就好比在主线程遍历 View树 以决定视图画多大(measure),画在哪(layout),画些啥(draw),计算结果存放在内存中,SurfaceFlinger 会调用 OpenGL 命令将内存中的数据渲染成图像存放在 GPU Buffer 中。每隔166ms,显示器从 Buffer 中取出帧并显示。所以自定义 View 可以通过重载onMeasure()、onLayout()、onDraw()来定义帧内容,但不能定义帧刷新频率。
SurfaceView可以突破这个限制。而且它可以将计算帧数据放到独立的线程中进行。下面是自定义SurfaceView的模版代码:
public abstract class BaseSurfaceView extends SurfaceView implements SurfaceHolderCallback {
public static final int DEFAULT_FRAME_DURATION_MILLISECOND = 50;
//用于计算帧数据的线程
private HandlerThread handlerThread;
private Handler handler;
//帧刷新频率
private int frameDuration = DEFAULT_FRAME_DURATION_MILLISECOND;
//用于绘制帧的画布
private Canvas canvas;
private boolean isAlive;
public BaseSurfaceView(Context context) {
super(context);
init();
}
protected void init() {
getHolder()addCallback(this);
//设置透明背景,否则SurfaceView背景是黑的
setBackgroundTransparent();
}
private void setBackgroundTransparent() {
getHolder()setFormat(PixelFormatTRANSLUCENT);
setZOrderOnTop(true);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
isAlive = true;
startDrawThread();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
stopDrawThread();
isAlive = false;
}
//停止帧绘制线程
private void stopDrawThread() {
handlerThreadquit();
handler = null;
}
//启动帧绘制线程
private void startDrawThread() {
handlerThread = new HandlerThread(“SurfaceViewThread”);
handlerThreadstart();
handler = new Handler(handlerThreadgetLooper());
handlerpost(new DrawRunnable());
}
private class DrawRunnable implements Runnable {
@Override
public void run() {
if (!isAlive) {
return;
}
try {
//1获取画布
canvas = getHolder()lockCanvas();
//2绘制一帧
onFrameDraw(canvas);
} catch (Exception e) {
eprintStackTrace();
} finally {
//3将帧数据提交
getHolder()unlockCanvasAndPost(canvas);
//4一帧绘制结束
onFrameDrawFinish();
}
//不停的将自己推送到绘制线程的消息队列以实现帧刷新
handlerpostDelayed(this, frameDuration);
}
}
protected abstract void onFrameDrawFinish();
protected abstract void onFrameDraw(Canvas canvas);
}
用HandlerThread作为独立帧绘制线程,好处是可以通过与其绑定的Handler方便地实现“每隔一段时间刷新”,而且在Surface被销毁的时候可以方便的调用HandlerThreadquit()来结束线程执行的逻辑。
DrawRunnablerun()运用模版方法模式定义了绘制算法框架,其中帧绘制逻辑的具体实现被定义成两个抽象方法,推迟到子类中实现,因为绘制的东西是多样的,对于本文来说,绘制的就是一张张,所以新建BaseSurfaceView的子类FrameSurfaceView:
逐帧解析 & 及时回收
public class FrameSurfaceView extends BaseSurfaceView {
public static final int INVALID_BITMAP_INDEX = IntegerMAX_VALUE;
private List bitmaps = new ArrayList<>();
//帧
private Bitmap frameBitmap;
//帧索引
private int bitmapIndex = INVALID_BITMAP_INDEX;
private Paint paint = new Paint();
private BitmapFactoryOptions options = new BitmapFactoryOptions();
//帧原始大小
private Rect srcRect;
//帧目标大小
private Rect dstRect = new Rect();
private int defaultWidth;
private int defaultHeight;
public void setDuration(int duration) {
int frameDuration = duration / bitmapssize();
setFrameDuration(frameDuration);
}
public void setBitmaps(List bitmaps) {
if (bitmaps == null || bitmapssize() == 0) {
return;
}
thisbitmaps = bitmaps;
//默认情况下,计算第一帧的原始大小
getBitmapDimension(bitmapsget(0));
}
private void getBitmapDimension(Integer integer) {
final BitmapFactoryOptions options = new BitmapFactoryOptions();
optionsinJustDecodeBounds = true;
BitmapFactorydecodeResource(thisgetResources(), integer, options);
defaultWidth = optionsoutWidth;
defaultHeight = optionsoutHeight;
srcRect = new Rec
Android是一种基于Linux的自由及开放源代码的 *** 作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发。尚未有统一中文名称,中国大陆地区较多人使用“安卓”或“安致”。Android *** 作系统最初由Andy Rubin开发,主要支持手机。
一直以来,Android系统由于底层语言的问题,在音频播放上存在一个漏洞,即48khz采样率转换为441khz会被劣质SRC。这种被劣质SRC的问题,使得音频信号在安卓设备里受到了扭曲和损耗,产生大量噪波,立体声播放层次等这些指标全面受损。而用户需求较多的高品质音乐母生带、高清视频、游戏等的音频都是高于441khz的采样率;因此有很多用户不厌其烦抱怨安卓机器的音质失真和受损问题。
通过一段标准音频理论状态下的光谱图,我们可以发现正常安卓机型在播放48khz音频时,光谱图可谓惨不忍睹。主信号周围出现了巨量的噪波,主信号基本难以分辨,因此难免会出现声道串声,杂音,变调等问题。
近期智能手机厂商vivo发布了其自主研发的音频技术VRS。据了解,vivo的VRS技术声称完全解决了上述困扰安卓系统音频播放的梦魇,并得到了国家专利受理。
而应用了VRS音频技术的vivo V1智能手机在播放48khz音频时,完全不存在任何问题,其主信号的保真度接近于理论完美状态。虽然信号源质量并不完全代表最后的听感,但我们也知道,有了接近无损的信号源,是能够取得优秀播放效果的前提。可见,VRS技术的出现,表明vivo智能手机在致力于追求产品完美的音质享受探索又迈上了一个新的高度。
private ImageView imageView,imageView2;
@Override
protected void onCreate(Bundle savedInstanceState) {
superonCreate(savedInstanceState);
setContentView(Rlayoutactivity_main);
imageView=(ImageView)superfindViewById(RidimageView);
imageView2=(ImageView)superfindViewById(RidimageView2);//找到你layout中对应的imageView
Drawable drawable=imageViewgetBackground();//获取它的资源,返回类型是Drawable
//假设你想把imageView的设置到其他容器中,比如imageView2,
imageView2setBackground(drawable);//imageView2就显示和imageView一样的了
}
以上就是关于安卓imageview怎么在代码中设置src全部的内容,包括:安卓imageview怎么在代码中设置src、android获取surfaceview里面的每一帧、安卓系统src问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)