标签: invalidation

Android ImageView.setMatrix()和.invalidate() - 重新绘制需要花费太多时间

任务:我想调整大小并在屏幕上移动图像.无论图像有多大,我都想顺利地做到这一点.API级别8应该支持该代码.

问题:我试过ImageViewscaleType="matrix".打电话ImageView.setMatrix()然后ImageView.invalidate()用小图片很好用,但对大图片很可怕.无论多大ImageView.

我可以以某种方式加快重新绘制,ImageView以便不会重新计算整个图像吗?也许有一种方法可以使用不同的组件完成任务?


编辑:有关我想要实现的更多信息.

  • pw,ph - 图片的宽度和高度(以像素为单位)
  • dw,dh - 设备显示的宽度和高度(以像素为单位)
  • fw,fh - 可见帧的宽度和高度(以像素为单位)
  • x,y - 框架左上角的位置(以像素为单位) 可视化问题.

我想在屏幕上显示图像的一部分.属性x,y,fwfh不断变化.我正在寻找代码的一部分(想法),或者为这8个指定变量快速生成并显示图像部分的组件.


编辑2:关于pwph的信息

我假设pwph可以保持从1到无穷大的值.如果这种方法造成很多麻烦,我们可以假设图片不比用设备的相机拍摄的图片大.

java android invalidation imageview scaletype

15
推荐指数
1
解决办法
982
查看次数

Android:如何获取部分重绘的自定义视图?

我有一个自定义视图,填满了我的整个屏幕.(钢琴键盘)当用户触摸该键时,它将invalidate()被调用并且整个键盘被重新绘制以用触摸的键显示新状态.

目前视图非常简单,但我计划添加更多漂亮的图形.由于整个键盘是动态渲染的,这将使重绘整个键盘更加昂贵.

所以我想,让我们看看部分重绘.现在我打电话invalidate(Rect dirty)给正确的脏区.onDraw(Canvas canvas)如果我确实想要部分重绘,我将我的方法设置为仅在脏区域中绘制键.这会导致绘制这些键,但键盘的其余部分完全是黑色/根本不绘制.

我错误地期望调用invalidate(Rect dirty)会"缓存"当前canvas,并且只允许在脏区域中"绘制"绘图吗?

有什么方法可以实现我想要的吗?(一种"缓存"画布并仅重绘脏区的方法?"

android drawing partial invalidation

14
推荐指数
2
解决办法
1万
查看次数

在线程android应用程序内无效()

我是编程机器人的新手,但我有很多编程黑莓的经验.

我创建了一个具有活动类(main.java)和视图类(game.java)的应用程序.

在视图类中,我有一些位图被绘制到屏幕上.我创建了一个线程,我在线程中移动图像.但是当我在线程中调用invalidate()时,它永远不会重绘屏幕.

您是否无法从线程中使()屏幕无效?我知道线程正在运行并且正在调用invalidate,它只是永远不会在屏幕上进行更改.

android invalidation

14
推荐指数
1
解决办法
8060
查看次数

什么时候需要在swing组件上调用revalidate()以使其刷新,何时不需要?

在处理swing组件时,以及在运行时更改组件时,一个(通常)需要在组件上调用revalidate()方法以便刷新它们.

确定是否需要重新验证组件的规则是什么?当某个组件上的某些特性发生变化时,swing会自动调用revalidate()吗?

java validation swing invalidation

14
推荐指数
1
解决办法
5474
查看次数

如何验证/无效会话jsp/servlets?

当用户成功登录时,我在servlet中打开了会话:

HttpSession session = request.getSession(true);
session.setAttribute("name", name);
Run Code Online (Sandbox Code Playgroud)

然后我在logout.jsp中写道来终止会话:

<%session.invalidate();%>
Run Code Online (Sandbox Code Playgroud)

要检查会话是否有效,我这样做:

HttpSession session = request.getSession();
String name = (String) session.getAttribute("name");
Run Code Online (Sandbox Code Playgroud)

但它没有用,即使在session.invalidate之后,我的会话也有效.有谁知道我在哪里做错了?

session jsp servlets invalidation

12
推荐指数
1
解决办法
8万
查看次数

std :: list <> :: splice使迭代器无效.什么道理呢?

我想知道使std::list<>::splice引用新子容器中的子序列的迭代器无效的原因是什么.这看起来有点不合逻辑,特别是在标准std::container::swap规格方面.根据语言标准std::container::swap 不会使任何迭代器无效.这是一个非常合理的实用规范.但是,我会说这std::list<>::splice也会从保留迭代器的行为中获益匪浅.

我理解可能存在基于迭代器可达性等概念的纯粹学术考虑.但同时splice也是一种std::list特定的操作,这意味着为它提供定制的规范可能不会对其造成严重的概念损害.一般的STL设计.

那是什么?它会使一些std::list我认识不到的实际实施变得非法或过于复杂吗?

c++ iterator stl invalidation

11
推荐指数
1
解决办法
805
查看次数

NSTimer禁用UIView中的dealloc

@interface someview:UIView{
  NSTimer* timer;
}
@end

@implementation someview

-(void)dealloc{
  NSLog(@"dealloc someview");
  [timer invalidate];
  timer = nil;
}
-(void)runTimer{
//
}
-(void)someMethod{

  timer = [NSTimer timerWithTimeInterval:2.0f target:self selector:@selector(runTimer) userInfo:nil repeats:YES];
}

@end
Run Code Online (Sandbox Code Playgroud)

释放someview不会调用dealloc并且计时器继续运行.

如果我注释掉"timer = [NSTimer schedule ...."部分,将调用dealloc.这意味着我的代码的所有其他部分都正常工作,而计时器是罪魁祸首.runTimer方法是空的,这意味着它只是与我混淆的计时器.

objective-c nstimer uiview invalidation dealloc

9
推荐指数
2
解决办法
3931
查看次数

Android:无效(脏)

看起来Android真的不喜欢invalidate (Rect dirty),它只用于使画布的一部分无效.当我使画布的一部分无效(在下面以绿色显示)并且画布的ToggleButton 外部需要同时重绘时,以红色显示的整个区域将被删除!似乎Android只是使最小矩形内的所有内容无效,包含需要重绘的两个区域的并集,即使其中一个区域位于View的外部,我的画布也无效.

这是标准行为,如果是这样,为什么有人会使用部分失效?

在此输入图像描述

android invalidation android-canvas

9
推荐指数
2
解决办法
5214
查看次数

使用索引避免迭代器失效,保持干净的接口

我创建了一个MemoryManager<T>类,它基本上是两个指针向量的包装器,用于管理堆分配对象的生命周期.

一个向量存储"活动"对象,另一个向量存储将在下一个添加的对象MemoryManager<T>::refresh.

选择此设计是为了避免在循环时使用迭代器失效MemoryManager<T>,因为直接向MemoryManager<T>::alive向量添加新对象会使现有迭代器无效(如果它的大小增大).

template<typename T> struct MemoryManager {
    std::vector<std::unique_ptr<T>> alive;
    std::vector<T*> toAdd;

    T& create() { 
        auto r(new T); 
        toAdd.push_back(r); 
        return *r; 
    }

    T& refresh() { 
         // Use erase-remove idiom on dead objects
         eraseRemoveIf(alive, [](const std::unique_ptr<T>& p){ return p->alive; });

         // Add all "toAdd" objects and clear the "toAdd" vector
         for(auto i : toAdd) alive.emplace_back(i); 
         toAdd.clear(); 
    }  

    void kill(T& mItem)  { mItem.alive = false; }

    IteratorType begin() { return alive.begin(); }
    IteratorType end() …
Run Code Online (Sandbox Code Playgroud)

c++ iterator vector invalidation c++11

9
推荐指数
2
解决办法
1535
查看次数

为什么在JAVA中session.invalidate()之后会话不为空?

在开发JavaEE WEB应用程序时,我面临着非常奇怪的问题.

即使在HttpSession使用失效后session.invalidate();,我也没有得到会话null.有一种情况,我在执行无效会话后有一个如下执行的语句.

if (null != session && null != session.getAttribute("loginToken")){
   //do something
}
Run Code Online (Sandbox Code Playgroud)

我没有在这里获得会话null,所以第二个条件将尝试执行.因此会话不是空的,所以我得到IllegalStateException- session is already invalidated.但是为什么会话在使它失效后不为空?:(

java session invalidation

9
推荐指数
2
解决办法
5万
查看次数