任务:我想调整大小并在屏幕上移动图像.无论图像有多大,我都想顺利地做到这一点.API级别8应该支持该代码.
问题:我试过ImageView
用scaleType="matrix"
.打电话ImageView.setMatrix()
然后ImageView.invalidate()
用小图片很好用,但对大图片很可怕.无论多大ImageView
.
我可以以某种方式加快重新绘制,ImageView
以便不会重新计算整个图像吗?也许有一种方法可以使用不同的组件完成任务?
编辑:有关我想要实现的更多信息.
我想在屏幕上显示图像的一部分.属性x,y,fw和fh不断变化.我正在寻找代码的一部分(想法),或者为这8个指定变量快速生成并显示图像部分的组件.
编辑2:关于pw和ph的信息
我假设pw和ph可以保持从1到无穷大的值.如果这种方法造成很多麻烦,我们可以假设图片不比用设备的相机拍摄的图片大.
我有一个自定义视图,填满了我的整个屏幕.(钢琴键盘)当用户触摸该键时,它将invalidate()
被调用并且整个键盘被重新绘制以用触摸的键显示新状态.
目前视图非常简单,但我计划添加更多漂亮的图形.由于整个键盘是动态渲染的,这将使重绘整个键盘更加昂贵.
所以我想,让我们看看部分重绘.现在我打电话invalidate(Rect dirty)
给正确的脏区.onDraw(Canvas canvas)
如果我确实想要部分重绘,我将我的方法设置为仅在脏区域中绘制键.这会导致绘制这些键,但键盘的其余部分完全是黑色/根本不绘制.
我错误地期望调用invalidate(Rect dirty)
会"缓存"当前canvas
,并且只允许在脏区域中"绘制"绘图吗?
有什么方法可以实现我想要的吗?(一种"缓存"画布并仅重绘脏区的方法?"
我是编程机器人的新手,但我有很多编程黑莓的经验.
我创建了一个具有活动类(main.java)和视图类(game.java)的应用程序.
在视图类中,我有一些位图被绘制到屏幕上.我创建了一个线程,我在线程中移动图像.但是当我在线程中调用invalidate()时,它永远不会重绘屏幕.
您是否无法从线程中使()屏幕无效?我知道线程正在运行并且正在调用invalidate,它只是永远不会在屏幕上进行更改.
在处理swing组件时,以及在运行时更改组件时,一个(通常)需要在组件上调用revalidate()方法以便刷新它们.
确定是否需要重新验证组件的规则是什么?当某个组件上的某些特性发生变化时,swing会自动调用revalidate()吗?
当用户成功登录时,我在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之后,我的会话也有效.有谁知道我在哪里做错了?
我想知道使std::list<>::splice
引用新子容器中的子序列的迭代器无效的原因是什么.这看起来有点不合逻辑,特别是在标准std::container::swap
规格方面.根据语言标准std::container::swap
不会使任何迭代器无效.这是一个非常合理的实用规范.但是,我会说这std::list<>::splice
也会从保留迭代器的行为中获益匪浅.
我理解可能存在基于迭代器可达性等概念的纯粹学术考虑.但同时splice
也是一种std::list
特定的操作,这意味着为它提供定制的规范可能不会对其造成严重的概念损害.一般的STL设计.
那是什么?它会使一些std::list
我认识不到的实际实施变得非法或过于复杂吗?
@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方法是空的,这意味着它只是与我混淆的计时器.
看起来Android真的不喜欢invalidate (Rect dirty)
,它只用于使画布的一部分无效.当我使画布的一部分无效(在下面以绿色显示)并且画布的ToggleButton
外部需要同时重绘时,以红色显示的整个区域将被删除!似乎Android只是使最小矩形内的所有内容无效,包含需要重绘的两个区域的并集,即使其中一个区域位于View的外部,我的画布也无效.
这是标准行为,如果是这样,为什么有人会使用部分失效?
我创建了一个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) 在开发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
.但是为什么会话在使它失效后不为空?:(