在开发android程序时,遇到一个问题,ImageSwitcher只支持手动的切换图片,不支持自动定时的切换。因为xamarin的资料很少,官方也没有相应的教程,所以想到这个方法,利用job程序来实现后台的操作。

布局文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="25px"
android:minHeight="25px"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/relativeLayout1"
android:background="#ffececec">
<ImageView
android:src="@drawable/ImgSlideLeft"
android:layout_width="50px"
android:layout_height="wrap_content"
android:id="@+id/btnFeatureLeft"
android:layout_centerVertical="true"
android:layout_alignParentLeft="true" />
<ImageSwitcher
android:minWidth="25px"
android:minHeight="25px"
android:layout_width="match_parent"
android:layout_height="638px"
android:id="@+id/SwitcherProductFeature"
android:layout_centerInParent="true" />
<ImageView
android:src="@drawable/ImgSlideRight"
android:layout_width="50px"
android:layout_height="wrap_content"
android:id="@+id/btnFeatureRight"
android:layout_centerVertical="true"
android:layout_alignParentRight="true" />
</RelativeLayout>

复制相应图片资源

后台代码:注意这里继承了GestureDetector.IOnGestureListener,监听用户的相关事件。代码中只写了 左滑和右滑事件。

[Activity(Label = "@string/app_name", Theme = "@style/AppTheme.NoActionBar", MainLauncher = true)]
public class MainActivity : AppCompatActivity, ViewSwitcher.IViewFactory, GestureDetector.IOnGestureListener
{
private GestureDetector gestureDetector = null;
private ImageSwitcher imageSwitcher;
private int[] imgs = new int[]{
Resource.Drawable.p1,
Resource.Drawable.p2,
Resource.Drawable.p3,
Resource.Drawable.p4,
Resource.Drawable.p5,
Resource.Drawable.p6
};
private int currentPosition;
public TestJobService testjobservice;
public TextView t1;
Handler handler;
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState); //关键是这里,将MainActivity传给TestJobService类
handler = new Handler((Message msg) =>
{
testjobservice = (TestJobService)msg.Obj;
testjobservice.setUiCallback(this);
}); SetContentView(Resource.Layout.activity_main);
gestureDetector = new GestureDetector(this);
imageSwitcher = FindViewById<ImageSwitcher>(Resource.Id.SwitcherProductFeature);
currentPosition = 0;
imageSwitcher.SetFactory(this);
imageSwitcher.SetImageResource(Resource.Drawable.p1); t1 = FindViewById<TextView>(Resource.Id.tv1); Intent intent = new Intent(this, typeof(TestJobService));
intent.PutExtra("messenger", new Messenger(handler));//传参
StartService(intent);
doService();
} public View MakeView()
{
ImageView img = new ImageView(this);
img.SetBackgroundColor(Android.Graphics.Color.Transparent);
img.SetScaleType(ImageView.ScaleType.FitCenter);
return img;
} public override bool OnTouchEvent(MotionEvent e)
{
return gestureDetector.OnTouchEvent(e);
} public bool OnFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY)
{
if (e2.GetX() - e1.GetX() > 100)
{
currentPosition--;
if (currentPosition < 0)
currentPosition = imgs.Length - 1;
//imageSwitcher.SetInAnimation(this, Android.Resource.Animation.FadeIn);//设置淡入动画
//imageSwitcher.SetInAnimation(this, Android.Resource.Animation.FadeOut);
imageSwitcher.SetImageResource(imgs[currentPosition]);
}
else if (e2.GetX() - e1.GetX() < -100)
{
currentPosition++;
if (currentPosition > imgs.Length - 1)
currentPosition = 0;
//imageSwitcher.SetInAnimation(this, Android.Resource.Animation.FadeIn);//设置淡入动画
//imageSwitcher.SetInAnimation(this, Android.Resource.Animation.FadeOut);
imageSwitcher.SetImageResource(imgs[currentPosition]);
}
return true;
} public bool OnDown(MotionEvent e)
{
return false;
} public void OnLongPress(MotionEvent e)
{
} public bool OnScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)
{
return false;
} public void OnShowPress(MotionEvent e)
{
} public bool OnSingleTapUp(MotionEvent e)
{
return false;
} public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
{
Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults); base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
} private void doService()
{
JobScheduler jobScheduler = (JobScheduler)GetSystemService(JobSchedulerService);
ComponentName componentName = new ComponentName(this, Java.Lang.Class.FromType(typeof(TestJobService)));
JobInfo jobinfo = new JobInfo.Builder(1001, componentName)
.SetPeriodic(5000) //设置每5秒钟执行一次
.Build();
jobScheduler.Schedule(jobinfo);
}
//自动切换主要在这里实现。
public void OnReceivedStartJob()
{
currentPosition++;
if (currentPosition > imgs.Length - 1)
currentPosition = 0;
imageSwitcher.SetImageResource(imgs[currentPosition]);
}
}

新建job处理类

[Service(Exported = true, Permission = "android.permission.BIND_JOB_SERVICE")]
public class TestJobService : JobService
{
public int i = 0;
MainActivity owner;
public override bool OnStartJob(JobParameters args)
{
doJob (args);
return false;
} public override bool OnStopJob(JobParameters args)
{
Log.Info("服务停止", "stop job service"); return true;
} private void doJob(JobParameters args)
{
if (args.JobId == 1001)
{
owner.OnReceivedStartJob();//返回到主线程中操作。
}
else if(args.JobId==1002)
{
//这里可以扩展第二个或第三个,根据jobiD判断
} } public void setUiCallback(MainActivity activity)
{
owner = activity;
} public override StartCommandResult OnStartCommand(Intent intent, Android.App.StartCommandFlags flags, int startId)
{
var callback = (Messenger)intent.GetParcelableExtra("messenger");
var m = Message.Obtain();
m.What = 2;//如果有多种消息,可以通过这个参数进行判断,进行不同的操作
m.Obj = this;
try
{
callback.Send(m);
}
catch (RemoteException e)
{
Log.Error("Tag", e, "Error passing service object back to activity.");
}
return StartCommandResult.NotSticky;
}
}

运行效果图

我还添加了左右两个按钮,也可以添加事件,点击切换。

官方关于Android 作业计划程序的介绍请参考以下链接。

https://learn.microsoft.com/zh-cn/xamarin/android/platform/android-job-scheduler

Xamarin.Android 利用作业计划程序实现ImageSwitcher图片自动定时轮播的更多相关文章

  1. Android之仿京东淘宝的自动无限轮播控件

    在App的开发中,很多的时候都需要实现类似京东淘宝一样的自动无限轮播的广告栏,所以就自己写了一个,下面是我自定义控件的思路和过程. 一.自定义控件属性 新建自定义控件SliderLayout继承于Re ...

  2. 利用jQuery实现图片无限循环轮播(不借助于轮播插件)

    原来我主要是用Bootstrap框架或者swiper插件实现轮播图的功能,而这次是用jQuery来实现图片无限循环轮播! 用到的技术有:html.css.JavaScript(少).jQuery(主要 ...

  3. js 实现图片间隔循环轮播以及没有间隔的循环轮播

    链接地址:http://blog.sina.com.cn/s/blog_75cf5f32010199dn.html 最近做了个图片循环轮播的功能.就是几张图片不断的循环滚动显示. 感觉这个方法不错所以 ...

  4. iOS:实现图片的无限轮播(二)---之使用第三方库SDCycleScrollView

    iOS:实现图片的无限轮播(二)---之使用第三方库SDCycleScrollView 时间:2016-01-19 19:13:43      阅读:630      评论:0      收藏:0   ...

  5. Android自动滚动 轮播循环的ViewPager

    主要介绍如何实现ViewPager自动播放,循环滚动的效果及使用.顺便解决ViewPager嵌套(ViewPager inside ViewPager)影响触摸滑动及ViewPager滑动速度设置问题 ...

  6. iOS:实现图片的无限轮播---之使用第三方库SDCycleScrollView

    SDCycleScrollView API // //  SDCycleScrollView.h //  SDCycleScrollView #import <UIKit/UIKit.h> ...

  7. Xamarin.Android 利用Fragment实现底部菜单

    效果图: 第一步:添加引用 引用 Crosslight.Xamarin.Android.Support.v7.AppCompat 这个包. 第二步:绘制Main和Fragment界面 fg_home. ...

  8. 利用CSS3实现图片无间断轮播图的实现思路

    前言:图片轮播效果现在在各大网站都是非常普遍的,以前我们都是通过postion的left or right来控制dom的移动,这里我要说的是利用css3来制作轮播!相比以前通过postion来移动do ...

  9. 【实践】纯jquery实现图片滑动无缝轮播,带左右按钮及控制按钮

    在此随笔之前,博主已经做过一次图片滑动轮播,如过你也有看过就会知道里面的效果在自动轮播的时候有一个不太美观的效果,就是当最后一张图片滑动切换到第一张图片的时候会看到一个快速向左滑动的效果,这是很不美观 ...

  10. 响应式图片菜单式轮播,兼容手机,平板,PC

    昨天在给自己用bootstrap写一个响应式主业模版时想用一个图片轮播js,看到了bootstrap里面的unslider.js,只有1.7k,很小,很兴奋,但使用到最后发现不兼容手机,当分辨率变化的 ...

随机推荐

  1. 2022-04-11内部群每日三题-清辉PMP

    1.项目经理从制造商那里收到一个更新信息,说一个必要的设备修理可能会导致他们的可交付成果迟八周时间.项目经理应该怎么做? A.确定关键路径 B.实施沟通管理计划 C.执行假设情景分析 D.对项目进度赶 ...

  2. less的基本用法

    学习less详细文章链接 https://juejin.cn/post/6844903520441729037#heading-9

  3. Python 用exec来获取字符串所对应的字典

    Python 用exec来获取字符串所对应的字典 Python exec 问题的提出 想要遍历两个结构相似的字典,但是不想采用字典内嵌套字典的方式,所以想要通过一个列表,该列表包含字典名称.也就是通过 ...

  4. pycharm开发工具的介绍和使用

    pycharm开发工具的介绍和使用 PyCharm是常用的python开发工具之一,分为社区版和专业版,社区版只有基础的python环境,专业版的功能会多很多

  5. 在Unity3D中开发的坦克履带模拟器Tank Track Simulator

    为了在Unity游戏中比较真实地模拟坦克履带的运动,本人便开发了这款Tank Track Simulator插件 特点 比较真实地模拟了坦克履带的运动. 本插件中包含了一辆M1A2坦克模型,已经将这个 ...

  6. Ubuntu ROOT默认密码设置

    Ubuntu默认密码设置 Ubuntu默认是不设置ROOT密码的,如果需要安装一些包则需要从普通用户调转至ROOT用户,这个时候就需要设置一下密码了. 下面这种情况 chen@chen:~/Deskt ...

  7. 【python】读取nc文件

    读取nc文件前的准备,安装一些库 1.先把几个用到的库下载 Cartopy 简介与安装(转载) - 简书 (jianshu.com) Python Extension Packages for Win ...

  8. applicationContext.xml及springMVC.xml详解

    在前面的web.xml详解里,我们引入applicationContext.xml和springMVC.xml两个配置文件, 前者是spring 全局配置文件,用来控制spring 特性的, 后者则是 ...

  9. 修改mysql 一张表中某列字段值

    UPDATE  表名 SET  字段名 = replace(字段名,'原来值','修改值'): 例: UPDATE pd_purchase SET type_status =replace(type_ ...

  10. JS笔记(三):函数与对象

    镇楼图 Pixiv:torino 四.Function类型 Rest语法 一些函数如Math.max可以支持任意数量的参数,JS中对于这样的参数可以简单使用...来实现,使用剩余参数,它支持收集剩余的 ...