- 浏览: 3940228 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
hinuliba:
...
字体背景颜色的高度修改 -
KANGOD:
最后的 -createDialog() 私有方法是怎么回事,没 ...
简单的实现listView中item多个控件以及点击事件 -
sswangqiao:
呵呵,呵呵
onActivityResult传值的使用 -
yumeiqiao:
感觉你所的不清楚 lstView.setOnTouchLi ...
listview中viewflipper的问题 -
lizhou828:
果然是大神啊!!!
Animation动画效果的实现
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.os.Bundle;
import android.util.Log;
import android.view.Display;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.view.GestureDetector.OnGestureListener;
import android.view.ViewGroup.LayoutParams;
public class Timeline extends Activity {
ScrollableImageView scrollImageView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
WindowManager w = getWindowManager();
Display d = w.getDefaultDisplay();
scrollImageView = new ScrollableImageView(this,
BitmapFactory.decodeResource(getResources(), R.drawable.rocks),
d.getWidth(), d.getHeight(),
null);
setContentView(scrollImageView);
}
public boolean onTouchEvent(MotionEvent event) {
return scrollImageView.getGestureScanner().onTouchEvent(event);
}
////
////
class ScrollableImageView extends View {
int scrollRate = 40;
int scrollX = 0;
int scrollY = 0;
boolean scrollHorizontalEnabled = true;
boolean scrollVerticalEnabled = true;
////
Bitmap image;
Bitmap bufferImage;
int maxWidth;
int maxHeight;
int pictureWidth;
int pictureHeight;
////
Paint paint;
GestureDetector gestureScanner;
////
////
public ScrollableImageView(Context context, Bitmap image, int width,
int height, Paint paint) {
super(context);
this.image = image;
this.paint = paint;
bufferImage = Bitmap.createBitmap(image);
calculateSize(width, height);
createGestureListener();
}
public ScrollableImageView(Context context, Bitmap image,
int width, int height, Paint paint,
boolean scrollHorizontal, boolean scrollVertical) {
super(context);
this.image = image;
this.paint = paint;
this.scrollHorizontalEnabled = scrollHorizontal;
this.scrollVerticalEnabled = scrollVertical;
bufferImage = Bitmap.createBitmap(image);
calculateSize(width, height);
createGestureListener();
}
protected void calculateSize(int width, int height) {
//picture size
pictureWidth = image.getWidth();
pictureHeight = image.getHeight();
//window size
maxWidth = Math.min(pictureWidth, width);
maxHeight = Math.min(pictureHeight, height);
//layout size
setLayoutParams(new LayoutParams(pictureWidth, pictureHeight));
}
protected void createGestureListener(){
setGestureScanner(new GestureDetector(new OnGestureListener() {
public boolean onScroll(MotionEvent event1, MotionEvent event2,
float distanceX, float distanceY) {
handleScroll(distanceX, distanceY);
return true;
}
public boolean onDown(MotionEvent event) {
return true;
}
public boolean onFling(MotionEvent event1, MotionEvent event2,
float velocityX, float velocityY) {
return true;
}
public void onLongPress(MotionEvent event) {
//do nothing
}
public void onShowPress(MotionEvent event) {
//do nothing
}
public boolean onSingleTapUp(MotionEvent event) {
return true;
}
}));
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawBitmap(bufferImage, 0, 0, paint);
}
protected void handleScroll(float distX, float distY) {
int maxScrollX = Math.max(pictureWidth - maxWidth, 0);
int maxScrollY = Math.max(pictureHeight - maxHeight, 0);
//X-Axis
if(scrollHorizontalEnabled){
if (distX > 6.0) {
if (scrollX < maxScrollX - scrollRate) {
scrollX += scrollRate;
}
else {
scrollX = maxScrollX;
}
} else if (distX < -6.0) {
if (scrollX >= scrollRate) {
scrollX -= scrollRate;
}
else {
scrollX = 0;
}
}
}
//Y-AXIS
if(scrollVerticalEnabled){
if (distY > 6.0) {
if (scrollY < maxScrollY - scrollRate) {
scrollY += scrollRate;
}
else {
}
} else if (distY < -6.0) {
if (scrollY >= scrollRate) {
scrollY -= scrollRate;
}
else {
scrollY = 0;
}
}
}
//Swap image
if ((scrollX <= maxWidth) && (scrollY <= maxHeight)) {
swapImage();
invalidate();
}
}
protected void swapImage() {
bufferImage = Bitmap.createBitmap(image, scrollX, scrollY,
maxWidth, maxHeight);
}
/**
* @return the gestureScanner
*/
public GestureDetector getGestureScanner() {
return gestureScanner;
}
/**
* @param gestureScanner the gestureScanner to set
*/
public void setGestureScanner(GestureDetector gestureScanner) {
this.gestureScanner = gestureScanner;
}
}
}
http://www.anddev.org/scrolling_a_picture_horizontally_and_vertically-t3245.html
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.os.Bundle;
import android.util.Log;
import android.view.Display;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.view.GestureDetector.OnGestureListener;
import android.view.ViewGroup.LayoutParams;
public class Timeline extends Activity {
ScrollableImageView scrollImageView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
WindowManager w = getWindowManager();
Display d = w.getDefaultDisplay();
scrollImageView = new ScrollableImageView(this,
BitmapFactory.decodeResource(getResources(), R.drawable.rocks),
d.getWidth(), d.getHeight(),
null);
setContentView(scrollImageView);
}
public boolean onTouchEvent(MotionEvent event) {
return scrollImageView.getGestureScanner().onTouchEvent(event);
}
////
////
class ScrollableImageView extends View {
int scrollRate = 40;
int scrollX = 0;
int scrollY = 0;
boolean scrollHorizontalEnabled = true;
boolean scrollVerticalEnabled = true;
////
Bitmap image;
Bitmap bufferImage;
int maxWidth;
int maxHeight;
int pictureWidth;
int pictureHeight;
////
Paint paint;
GestureDetector gestureScanner;
////
////
public ScrollableImageView(Context context, Bitmap image, int width,
int height, Paint paint) {
super(context);
this.image = image;
this.paint = paint;
bufferImage = Bitmap.createBitmap(image);
calculateSize(width, height);
createGestureListener();
}
public ScrollableImageView(Context context, Bitmap image,
int width, int height, Paint paint,
boolean scrollHorizontal, boolean scrollVertical) {
super(context);
this.image = image;
this.paint = paint;
this.scrollHorizontalEnabled = scrollHorizontal;
this.scrollVerticalEnabled = scrollVertical;
bufferImage = Bitmap.createBitmap(image);
calculateSize(width, height);
createGestureListener();
}
protected void calculateSize(int width, int height) {
//picture size
pictureWidth = image.getWidth();
pictureHeight = image.getHeight();
//window size
maxWidth = Math.min(pictureWidth, width);
maxHeight = Math.min(pictureHeight, height);
//layout size
setLayoutParams(new LayoutParams(pictureWidth, pictureHeight));
}
protected void createGestureListener(){
setGestureScanner(new GestureDetector(new OnGestureListener() {
public boolean onScroll(MotionEvent event1, MotionEvent event2,
float distanceX, float distanceY) {
handleScroll(distanceX, distanceY);
return true;
}
public boolean onDown(MotionEvent event) {
return true;
}
public boolean onFling(MotionEvent event1, MotionEvent event2,
float velocityX, float velocityY) {
return true;
}
public void onLongPress(MotionEvent event) {
//do nothing
}
public void onShowPress(MotionEvent event) {
//do nothing
}
public boolean onSingleTapUp(MotionEvent event) {
return true;
}
}));
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawBitmap(bufferImage, 0, 0, paint);
}
protected void handleScroll(float distX, float distY) {
int maxScrollX = Math.max(pictureWidth - maxWidth, 0);
int maxScrollY = Math.max(pictureHeight - maxHeight, 0);
//X-Axis
if(scrollHorizontalEnabled){
if (distX > 6.0) {
if (scrollX < maxScrollX - scrollRate) {
scrollX += scrollRate;
}
else {
scrollX = maxScrollX;
}
} else if (distX < -6.0) {
if (scrollX >= scrollRate) {
scrollX -= scrollRate;
}
else {
scrollX = 0;
}
}
}
//Y-AXIS
if(scrollVerticalEnabled){
if (distY > 6.0) {
if (scrollY < maxScrollY - scrollRate) {
scrollY += scrollRate;
}
else {
}
} else if (distY < -6.0) {
if (scrollY >= scrollRate) {
scrollY -= scrollRate;
}
else {
scrollY = 0;
}
}
}
//Swap image
if ((scrollX <= maxWidth) && (scrollY <= maxHeight)) {
swapImage();
invalidate();
}
}
protected void swapImage() {
bufferImage = Bitmap.createBitmap(image, scrollX, scrollY,
maxWidth, maxHeight);
}
/**
* @return the gestureScanner
*/
public GestureDetector getGestureScanner() {
return gestureScanner;
}
/**
* @param gestureScanner the gestureScanner to set
*/
public void setGestureScanner(GestureDetector gestureScanner) {
this.gestureScanner = gestureScanner;
}
}
}
http://www.anddev.org/scrolling_a_picture_horizontally_and_vertically-t3245.html
发表评论
-
URI 转path
2019-06-26 10:41 1319转自知乎Matisse package com.zhihu ... -
权限申请
2017-09-22 13:25 1262public class PermissionActivit ... -
onPreviewFrame 相机输出格式转换yuv420p保存成图片
2015-11-25 15:59 7564在最近项目中,因为特殊需要,底层相机往外输出了i420 也 ... -
new Android's Runtime Permission
2015-11-03 21:05 1239targetSdkVersion 23 开始 使用运行时权 ... -
自定义listview 边缘效果
2015-02-28 10:58 1738static void ChangeEdgeEffect( ... -
发射打开wifi
2015-01-07 10:25 1430WifiManager wifiManager = (Wif ... -
RecyclerView
2014-11-05 13:08 1254http://www.grokkingandroid.com ... -
获取点击区域
2014-04-28 09:39 1579@Override public void getHitR ... -
speex 和libogg 编译
2014-04-03 16:17 6403下载: http://www.speex.org/down ... -
rsync 同步
2014-03-28 17:06 1837两台android 设备 进行rsy ... -
流转字符串
2014-03-11 09:49 1520public static String convertSt ... -
java simplexml 序列化
2014-03-06 13:22 5961<?xml version="1.0&quo ... -
获取其他程序的特定资源
2014-03-05 09:33 1689try { PackageManager man ... -
检测来电属于哪个sim卡
2014-02-07 10:41 1720public class IncomingCallInter ... -
使用 NDK r9 编译ffmpeg
2014-01-16 13:32 168411. 环境 ubuntu 我的是13.10 ndk r9 ... -
android h264含so
2014-01-13 11:24 1545http://download.csdn.net/downlo ... -
xml转义字符
2013-12-18 09:29 1592" " ' & ... -
字体背景颜色的高度修改
2013-12-11 10:31 4212当使用android:lineSpacingExtra= ... -
屏保的实现
2013-12-07 10:27 2793最近需要做一个屏保,开始以为很简单,因为系统本身就带了屏保功 ... -
PreferenceActivity下嵌套PreferenceScreen在其它布局中
2013-11-21 16:32 9156今天在修改系统代码的时候,系统代码用了PreferenceA ...
相关推荐
Three.js提供了一个框架,使开发者能够轻松地创建3D模型和场景。它包含了一系列对象,如几何体、材质、光源、相机和渲染器,用于构建和展示3D世界。 二、创建场景和几何体 在Three.js中,首先需要创建一个Scene对象...
在本文中,我们将深入探讨AS3(ActionScript 3)中的地图转动实现,这是一个在游戏开发、导航系统或任何需要互动地图的应用程序中常见的功能。AS3是Adobe Flash Professional和FlashDevelop等工具所使用的编程语言,...
5. 移动设备支持:考虑到移动设备的普及,360度旋转图片也需要适应不同的操作系统和设备,例如iOS和Android。开发时要考虑设备的硬件性能和触摸屏操作,确保流畅的用户体验。 6. VR兼容:对于虚拟现实应用,360度...
总之,“VRPanoDemo”作为一个VR图片浏览器,它不仅提供了丰富的全景图片浏览体验,还考虑到了多平台兼容、用户交互和性能优化等多个方面,让用户体验到虚拟现实带来的无限魅力。随着VR技术的不断发展,这类应用将会...
通过以上步骤,你就可以在Photoshop中创建出一个逼真的3D地球模型了。 这个教程展示了Photoshop 3D功能的强大之处,对于想要学习3D图形设计的用户来说,是一份非常有价值的资源。通过实践,你可以掌握如何利用软件...
这是一项在Web开发中常用于地理位置展示和分析的重要技术。首先,我们需要理解百度地图API的基础概念及其核心功能。 百度地图JavaScript API 是一个强大的工具,它允许开发者在网页上集成地图功能,包括地图展示、...
`map()`函数将一个数值从一个范围映射到另一个范围。在本例中,`map(potVal, 0, 1023, 0, 179)`将电位器的读取值从0到1023转换为舵机能接受的0到179的范围。 7. **串行通信(Serial Communication)**: `Serial....
第一人称视角是指游戏中的摄像机位置与玩家角色的位置完全一致,玩家所看到的画面就像是通过自己的眼睛观察到的一样。这种视角在射击类游戏中尤为常见,可以极大地提高游戏的真实感和代入感。 #### 二、技术实现...
在移动设备上,可以结合陀螺仪和加速度计数据,实现基于用户头部转动的视角切换。此外,虚拟现实头显如Oculus Rift或HTC Vive也能提供沉浸式的全景体验,用户可以在虚拟环境中自由探索。 总的来说,全景数据采集是...
在机器人应用中,如果这个变阻器与机械关节的旋转角度相连,那么关节转动时,变阻器的值就会相应变化,通过Arduino读取并处理这些信息,我们可以精确控制或监测关节的角度。这在小型机器人、人形机器人或者教育...
每个脉冲信号使伺服电机转动一定的角度,机械手因此沿设定路径移动一定的距离。在本例中,一个脉冲使得机械手移动0.01mm。伺服驱动器参数PrO.08=6000表示每个伺服电机旋转一周,需要6000个脉冲信号,由于同步轮的...
为了使时钟看起来像在移动,可能还会使用动画技术,例如改变指针的角度以模拟时针、分针和秒针的转动。这通常涉及到对`OnPaint`消息的处理,以及使用`CDC`(设备上下文类)进行绘图。 总的来说,这个C++时钟程序...
【VR360全景浏览】是一种沉浸式技术,它通过模拟真实环境的360度全方位视角...从拍摄制作到展示交互,每一个环节都直接影响着用户的沉浸感和满意度。随着VR技术的发展,我们有理由期待更丰富、更真实的360度全景体验。
在这个项目中,开发者利用C#的强大功能,构建了一个交互式的俄罗斯方块游戏平台,玩家可以在其中体验到经典的游戏玩法。 首先,我们来探讨一下游戏的核心——交错数组(Map)。在俄罗斯方块中,地图是游戏的基础,...
无人驾驶车的工作原理是使用计算机视觉和传感器融合,获取一幅关于我们在世界上的位置的丰富图片,使 用定位确定我们在这个世界的精确位置,然后使用路径规划来绘制一条通过这个世界到达目标的地的路径,通过控制...
环视天空盒(Cubemap Skybox)则是天空盒的一种实现方式,它将六个平面图像拼接成一个立方体形状,分别对应前后左右上下六个方向。当相机移动或旋转时,对应的贴图会相应变化,从而创造出一种无限远的视觉效果。 在...
常见的VR视频格式有equirectangular(等距柱状投影)、cubemap(立方体贴图)等,其中equirectangular格式最为常见,它将全景图像映射到一个二维平面,便于处理和存储。VR视频播放器需要支持这些格式的解码和渲染。 ...
在移动应用开发中,经常会遇到集成地图服务的需求,Cordova作为一个流行的开源框架,允许开发者使用HTML、CSS和JavaScript来构建原生的移动应用。在这个"MapTest.rar"压缩包中,我们看到的是一个Cordova项目,它展示...
【STM32步进电机自动返回小车】项目是一个基于STM32微控制器的智能小车设计,利用步进电机实现精确的定位和移动。在这个系统中,STM32芯片作为核心控制器,负责处理传感器输入、电机控制以及路径规划等任务。步进...